Search-Fehler im LinkDB-Mod

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Search-Fehler im LinkDB-Mod

Beitrag von Holger »

Hallo,

bei der Suche bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Could not obtain search results<br /><br /><b><u>DEBUG MODE</u></b><br /><br />SQL
Error : 1054 Unknown column 'f1.link_id' in 'on clause'<br /><br />SELECT f1.*,
AVG(r.rate_point) AS rating, COUNT(r.votes_link) AS total_votes, u.user_id,
u.username, c.cat_id, c.cat_name, COUNT(DISTINCT cm.comments_id) AS total_comments
                                                        FROM phpbb_links AS f1, phpbb_link_categories AS c
                                                                LEFT JOIN phpbb_link_votes AS r ON f1.link_id = r.votes_link
                                                                LEFT JOIN phpbb_users AS u ON f1.user_id = u.user_id
                                                                LEFT JOIN phpbb_link_comments AS cm ON f1.link_id = cm.link_id
                                                        WHERE f1.link_id IN (18, 62) 
                                                        AND c.cat_id = f1.link_catid
                                                        AND f1.link_approved = '1' 
                                                        GROUP BY f1.link_id 
                                                        ORDER BY link_time DESC 
                                                        LIMIT 10<br /><br />Line : 479<br />File : link_search.php


IP: 90.234.2.89
USER: skrothandlaren
URL: /linkdb.php

FORM:
Array
(
    [search_keywords] => ih 444
    [search_terms] => any
    [search_author] => 
    [cat_id] => 0
    [comments_search] => YES
    [sort_method] => link_time
    [sort_order] => DESC
    [action] => search
    [submit] => Sök sajt
)
Woran kann das liegen?

Gruss
Holger
drkmnn666
Beiträge: 388
Registriert: Mi 23.Jan, 2008 17:29

Beitrag von drkmnn666 »

Code: Alles auswählen

1054 Unknown column 'f1.link_id' in 'on clause'
mmmhh, will ja nicht altklug klingen, aber schaut mir nach einem fehlenden wert in der datenbank aus oder? zumindest unbekannter wert... was ist, wenn du den mal löschst (backup)?
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Ich glaube es hat eher mit dem LEFT JOIN zu tun, oder?
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
drkmnn666
Beiträge: 388
Registriert: Mi 23.Jan, 2008 17:29

Beitrag von drkmnn666 »

ich muss mich berichtigen, unbekannter wert in der datenbank... ging es denn vorher oder haste gerade eingebaut?
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Der Fehler tauchte gerade erst auf ... vielleicht hat vorher niemand gesucht. mysql5 ist ja bei den JOIN etwas empfindlicher, war das nicht so?
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
drkmnn666
Beiträge: 388
Registriert: Mi 23.Jan, 2008 17:29

Beitrag von drkmnn666 »

da überforderst du mich, frag lieber oxpus. der hat da erheblich mehr den plan, weil ich hab den nicht so...
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wie bei allen Join-Verbindungen muss die "Master"-Tabelle, auf die gejoint wird, immer direkt vor der zu joindenden Tabelle aufgeführt werden!

Also in diesem Fall eben nicht so

Code: Alles auswählen

phpbb_links AS f1, phpbb_link_categories AS c
sondern so herum:

Code: Alles auswählen

phpbb_link_categories AS c, phpbb_links AS f1
Das ist nicht erst seit MySQL 5 so, sondern schon immer gewesen, nur hatte die MySQL 4er (und ältere Versionen) hier noch lascher nach geahndet, allerdings dann auch ggf. falsche Ergebnisse geliefert ;)

Zum besseren Verständnis sollte man sich das so einprägen:

Frage Daten aus Tabelle 1 und 2 ab und prüfe dabei, ob zu Daten aus Tabelle 2 ggf. auch was in Tabelle 3 dazu enthalten ist.

Das ist dann eine ganz andere Aussage, als wenn man das so verfasst:

Frage Daten aus Tabelle 1 und 2 ab und prüfe dann, ob zu Tabelle 1 auch Daten in Tabelle 3 enthalten sind.

Denn:

Mit der ersten Aussage werden Daten aus Tabelle 1 und Tabelle 2 in Verbindung mit Tabelle 3 gelesen, bei der zweiten Aussage versucht man aus Tabelle 1 und 2 einen Datensatz zu erzeugen, und anschliessend erst etwas aus der 3. Tabelle hinzubekommen.
Das dann genau letzteres nicht immer korrekt ist, kann man dann wohl verstehen, oder?

Und genau das ist in SQL auch so gemeint:

Erste Aussage:

Code: Alles auswählen

SELECT * FROM tabelle1 JEFT JOIN tabelle3 ON tabelle1.x = tabelle3.y, tabelle 2 WHERE...
Wobei man das eigentlich so besser sehen und schreiben sollte:

Code: Alles auswählen

SELECT * FROM (tabelle1 JEFT JOIN tabelle3 ON x = y), tabelle 2 where ...
Zweite Aussage:

Code: Alles auswählen

SELECT * FROM tabelle1, tabelle2 LEFT JOIN tabelle 3 ON tabelle1.x = tabelle3.y WHERE ...
Hier wird dann spätestens bei korrekter Schreibweise sichtbar, warum es so eben falsch ist oder zu falschen Ergebnissen führen kann:

Code: Alles auswählen

SELECT * FROM tabelle1, (tabelle2 LEFT JOIN tabelle 3 ON tabelle1.x = tabelle3.y) WHERE ...
Wie gesagt:
Es war so schon immer falsch gewesen, nur sind die Default-Einstellungen ab MySQL 5 schärfer und damit zwingt der DB-Server zum sauberen Programmieren.
Zuletzt geändert von oxpus am Di 01.Apr, 2008 15:32, insgesamt 2-mal geändert.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Holger
Beiträge: 2253
Registriert: Mi 17.Mär, 2004 18:09

Beitrag von Holger »

Danke!
Gefunden!
Real men don’t back up, they learn data recovery. ;-)
http://www.mysqldumper.de
http://www.mysqldumper.se
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ich habe noch mal editiert, um es zu verdeutlichen.
Vielleicht leuchtet es dann besser ein.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
drkmnn666
Beiträge: 388
Registriert: Mi 23.Jan, 2008 17:29

Beitrag von drkmnn666 »

ob ich mir das merke ist zwar relativ, aber sozusagen abwärtskompatibel oder??1 beinhaltet 2 und drei sozusagen in gewissen sinne...
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

[quote="drkmnn666";p="85853"]ob ich mir das merke ist zwar relativ, aber sozusagen abwärtskompatibel oder??1 beinhaltet 2 und drei sozusagen in gewissen sinne...[/quote]
???
Das muss ich jetzt nicht verstehen, oder?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
drkmnn666
Beiträge: 388
Registriert: Mi 23.Jan, 2008 17:29

Beitrag von drkmnn666 »

mmmhhh, also 1 ist der Master, zwei der Sekundant und drei der Sekundant vom Sekundanten. also praktisch wie 1 = haus, 2 = erste Etage und 3 = dritte Etage.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Jein.
Zu 1 und 2 könnten jeweils eine Detailtabelle existieren.
Tabelle 1 und 2 werden auch direkt verknüpft, da in beiden Tabellen immer ein passender Datensatz enthalten ist, die z. B. über eine gleichlautende ID verknüft werden.
Eine Tabelle joinen bedeutet aber, zu einer Haupttabelle vorhandene Detaildatensätze abzufragen, die nicht unbedingt vorhanden sein müssen!
Daher kann man nicht wirklich erst die Haupttabellen verbinden, damit den "gesamten" Datensatz erstellen und dann noch auf Details abfragen.
Daher muss der Join in der SQL-Anweisung immer direkt bei der Tabelle stehen, die auch gemeint ist, sonst kann der SQL-Parser der Datenbank das nicht sauber zuordnen und man erhält dann im besten Fall fehlerhafte Datensätze.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten