Hoi!

Ik heb een mysql database waar iedere 15 minuten artikelen aan toegevoegd worden. Doordat dit veelal nieuws artikelen van verschillende bronnen zijn, komt het nogal eens voor dat er een dubbel artikel in de database voorkomt. Ik wil graag het artikel dat het laatst aan de database toegevoegd is, met dezelfde titel verwijderen. Dit moet echter weer gelimiteerd worden tot 4 dagen.

Ik heb daar nu een hele knullige query voor. Deze haalt nu 1 dubbele post uit de database per keer dat hij gedraaid wordt. Ik wil graag dat de hele database doorzocht wordt, en de oudste titel blijft staan. Op dit moment draai ik de volgende query: *schaam*

<?


$sql = "SELECT post_title, id, COUNT(post_title) AS num FROM indexednews GROUP BY post_title HAVING (COUNT(post_title) > 1)";

$db->DbQuery( $sql );


if( $db->DbNumRows() > 0 )
while( $article = $db->DbNextRow() )
{

$id = $article['id'];


$sql = "DELETE FROM indexednews WHERE id={$id}";
$db->DbQuery( $sql );
if( $db->DbError() )
echo $db->DbError();
echo "Double post deleted";
}
?>


Ideeën iemand?
Waarom gebruik je geen UNIQUE? Dan is het onmogelijk om gegevens dubbel op te slaan en dus overbodig/zinloos om niet-bestaande dubbele gegevens te verwijderen.

Een probleem los je op daar waar het ontstaat, opruimen van rotzooi is een lapmiddel en moet je proberen te voorkomen. Er kan in de tussentijd te veel mis gaan.
Ik kan geen unique gebruiken in dit geval. Goed... Ik ben er een tijdje mee aan het rotzooien geweest, en ik denk dat ik voor select distinct moet gaan. Ik wil dus achteraf filteren. Probleem is dat ik meerdere velden wil outputten. Heeft iemand ervaring met select distinct? Kan het volgende:

<? sql = "SELECT DISTINCT title FROM table ORDER BY timestamp DESC LIMIT 0,15"; ?>

De query haalt de timestamp natuurlijk niet op, maar hoe krijg ik het voor elkaar dat distinct alleen voor de titel geldt, en dus de andere velden gewoon op kan halen? Hoop dat het een beetje duidelijk is.
<?php
 sql = "SELECT DISTINCT(title),rest_van_je_velden FROM table ORDER BY timestamp DESC LIMIT 0,15"; 
?>


let op, geen shorttags, sommige servers ondersteunen dit niet!

Overigens ben ik het met Frank eens dat dit niet de beste oplossing is, maargoed.
Ja, het is dus eigenlijk al te laat, en waarom je geen UNIQUE zou kunnen/mogen gebruiken vertel je er niet bij.

Probeer zoiets (lapmiddel):

select veld1, veld2, veld3
from partners
group by veld1

dan krijg je alleen unieke waarden van veld1.
@ Stefan: die zal niet werken. DISTINCT en DISTINCTROW zijn synoniem, dus hij kijkt per rij of die uniek is. In title kunnen dan nog steeds dubbele waarden voorkomen, als de rest van de velden maar verschilt.
Ha die Stefan en Jan,

Het is gelukt met distinct... Ik snap dat het niet de meest optimale oplossing is, en we gaan in de toekomst zoeken naar een betere.

Hartstikke bedankt, in iedergval...

Arthur
Hoi Jan... Bij mij werkt het volgende gewoon:

<? $sql = "SELECT DISTINCT(title), desc, url, timestamp, site FROM table ORDER BY timestamp DESC LIMIT 0,15"; ?>
Toch vaag dat UNIQUE niet mogelijk. Met distinct doe je namelijk precies hetzelfde, maar dan op het moment van ophalen van de gegevens. Zorg dat je de juiste constraints gebruikt bij de invoer, dan heb je het lapmiddel DISTINCT helemaal niet nodig.

In PostgreSQL kun je overigens veel uitgebreidere constraints aanmaken dan in MySQL. check is je beste vriend, zeker in combinatie met een stored procedure.

Reageren