Dubbele artikelen in database
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*
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
$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";
}
?>
$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?
Gewijzigd op 01/01/1970 01:00:00 door Arthur Diependaal
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.
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.
Code (php)
1
2
3
2
3
<?php
sql = "SELECT DISTINCT(title),rest_van_je_velden FROM table ORDER BY timestamp DESC LIMIT 0,15";
?>
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.
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.
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
In PostgreSQL kun je overigens veel uitgebreidere constraints aanmaken dan in MySQL. check is je beste vriend, zeker in combinatie met een stored procedure.