SQL-Problem - Doppelte Einträge

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

SQL-Problem - Doppelte Einträge

Beitrag von D@ve »

Also, es geht darum, eine Linkliste zu generieren, mit den letzten 10 (x) Seiten die auf unsere Seite verlinkt haben. Diese will ich aus einer Liste mit referer_urls generieren, allerdings soll
a) nur die Domain wiedergegeben werden
b) soll keine Domain Doppelt vorkommen

Hier mein bisheriges SQL-Statement:

Code: Alles auswählen

    $sql = "SELECT DISTINCT SUBSTRING(user_referer,1, INSTR(SUBSTRING(user_referer,8),'/')+6 ) as url, user_referer,  visit_time FROM " . COUNTER_TABLE . "
            WHERE site_id = 0
            AND user_referer != '' " . 
            $sql_exclude_urls . "
            ORDER BY visit_time DESC
            LIMIT 10";
"user_referer" ist die volle URL. Der generierte String-Ausdruck "url" ist die auf die reine Domain gekürzte URL. $sql_exclude_urls ist eine Blacklist um später URLs komplett zu entfernen.

So sieht es zB in der DB aus, (nach timestamp sortiert)
http://www.google.de/search?hl=de&safe= ... est+&meta=
http://www.google.de/search?q=musik+mag ... rt=10&sa=N
http://lexikon.freenet.de/Musiker
http://www.google.com/search?client=saf ... 8&oe=UTF-8
http://www.klanggeschichten.de/
http://www.basslab.de/OCT/body_index.htm
http://www.powerbass.de/basslinks.html
http://www.google.com/search?hl=de&rls= ... in&spell=1
http://www.kostenlos.de/suchergebnis.html
http://www.google.de/search?q=musiker+m ... =0&start=0

Das funktioniert eigentlich recht gut, bis auf die Kleinigkeit, dass er trotz DISTINCT die doppelten URLs nicht entfernt:

http://www.google.de
http://www.google.de
http://lexikon.freenet.de
http://www.google.com
http://www.basslab.de
http://www.powerbass.de
http://www.google.com
http://www.kostenlos.de
http://www.google.de

Rauskommen sollte aber
http://www.google.de
http://lexikon.freenet.de
http://www.google.com
http://www.basslab.de
http://www.powerbass.de
http://www.kostenlos.de
http://www.klanggeschichten.de
http://pda.de.wapedia.org
http://www.phpbb.de
http://de.worldsearch.com

Gruppiere ich nach "url" funktioniert es allerdings auch nicht. Dann schmeißt er viel zu viele Links raus, was ich irgendwie nicht nachvollziehen kann:

Code: Alles auswählen

    $sql = "SELECT SUBSTRING(user_referer,1, INSTR(SUBSTRING(user_referer,8),'/')+6 ) as url, user_referer,  visit_time FROM " . COUNTER_TABLE . "
            WHERE site_id = 0
            AND user_referer != '' " . 
            $sql_exclude_urls . "
            GROUP BY  url
            ORDER BY visit_time DESC
            LIMIT 10";
Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

DISTINCT wirkt sich auf alle Spalten aus, d.h. wenn user_referer oder visit_time von zwei Datensätzen unterschiedlich sind, werden beide ins Ergebnis mit aufgenommen.
Die GROUP BY Variante sollte (zumindest unter MySQL) funktionieren. Unter vielen anderen DBMS wird da aber die fehlende Aggregatfunktion (MIN, MAX, AVG etc.) bemängelt. Wie sieht denn das Ergebnis davon aus bzw. welche URLs werden da zuviel rausgefiltert?
KB:knigge
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Beitrag von D@ve »

Pyramide hat geschrieben:Wie sieht denn das Ergebnis davon aus bzw. welche URLs werden da zuviel rausgefiltert?
Viel zu viele. Er übernimmt etwa nur jede zehnte URL...

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Schon mal mit

Code: Alles auswählen

GROUP BY SUBSTRING(user_referer,1, INSTR(SUBSTRING(user_referer,8),'/')+6 )
probiert?

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Antworten

Zurück zu „Coding & Technik“