Seite 1 von 1

SQL-Problem - Doppelte Einträge

Verfasst: 16.07.2005 15:43
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

Verfasst: 16.07.2005 16:13
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?

Verfasst: 16.07.2005 16:21
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

Verfasst: 17.07.2005 00:43
von PhilippK
Schon mal mit

Code: Alles auswählen

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

Gruß, Philipp