2009-08-07 10 views
1
$threads = mysql_query("SELECT DISTINCT t.id, t.title 
         FROM threads t LEFT JOIN comments c ON t.id = c.parentID 
         ORDER BY c.date DESC"); 

while ($thread = mysql_fetch_assoc($threads)) { 

echo "<li><a href=\"?threadID=$thread[id]\">".htmlspecialchars($thread['title'])."</a></li>\n"; 

} 

Kann jemand ein Problem in diesem Code sehen? Es wird nicht funktionieren, wie ich es will. Ich will es den Thread, in spätestens am oben kommentiert wurde, und die die nächste neueste usw.Hilfe mit diesem JOIN

echo $ Thread [parentID] Echos nichts

Kommentare:
id, Kommentar, parentID, Datum

+1

Fäden definitiv Artikel hat ? Ich in der Regel die volle LEFT OUTER JOIN auch – RiddlerDev

+0

Ja, ich habe Bündel von Themen und Kommentare –

+0

@OP: Können Sie klären das „Es wird nicht funktionieren, wie ich es will“ -Teil? – Eric

Antwort

2

Sie bestellen durch eine Spalte in Ihrem DISTINCT Liste.

Dies ist gültige Syntax in MySQL, aber diese ORDER BY ist bedeutungslos.

Diese Syntax ist ein MySQL extension, diese Abfrage wird in keinem anderenMotor der großen vier fehlschlagen.

Es wird verwendet, um die DISTINCT und GROUP BY Abfragen in den Fällen zu vereinfachen, wenn gleicher Wert von column in SELECT oder ORDER BY auf denselben Wert der Spalte entspricht immer in GROUP BY oder DISTINCT.

Wenn Ihr Fall, Sie mehrere Werte von c.date für jeden Wert von t.id haben kann, und welcher Wert von c.date für ORDER BY ausgewählt werden bei weitem noch nicht garantiert ist (es kann der letzte Wert, der erste Wert oder andere sein Wert).

Ihre Abfrage wie diese Rewrite:

SELECT t.id, t.title, 
     (
     SELECT c.date 
     FROM comments c 
     WHERE c.parent_id = t.id 
     ORDER BY 
       c.date DESC 
     LIMIT 1 
     ) lastcomment 
FROM threads t 
ORDER BY 
     ISNULL(lastcomment), lastcomment 
+0

kann nicht bekommen, dass man zur Arbeit. # 1064 - ... in der Nähe von 'ON c.parentID = t.id verwenden ORDER BY c.date DESC' in Zeile 5 –

+0

'@ Pryztojny': behoben. Es wäre einfacher, die Syntax zu überprüfen, wenn Sie Ihre Tabellendefinitionen gepostet haben. – Quassnoi

+0

@Quassnoi - warum sagst du ORDER BY auf Spalte nicht in der Auswahlliste ist bedeutungslos? Es scheint in MySQL 5.0 gut zu funktionieren. Können Sie einen Link zur Dokumentation bereitstellen, in der dieses Verhalten beschrieben wird? – ChssPly76

0

Versuchen Sie, die Abfrage im MySQL Query-Browser für Ihre Daten auszuführen, und prüfen Sie, ob dies Ergebnisse liefert. Wenn dies der Fall ist, liegt das Problem bei Ihrem Echo, nicht bei Ihrer Abfrage.

+0

es kommt zurück, aber es wird nicht wie ich es will, der letzte kommentierte Thread oben –

-1

ich genau bin nicht sicher, was Sie versuchen zu erreichen, aber wenn man die parentID Echo wollen, müssen Sie es in der Abfrage.

$threads = mysql_query("SELECT DISTINCT t.id, t.title, c.parentID 
         FROM threads t LEFT JOIN comments c ON t.id = c.parentID 
         ORDER BY c.date DESC"); 
0

ich nicht MySQL verwendet haben, in eine Weile so ist dies etwas, was ich Werke in Tsql kennen. Sie könnten versuchen:

SELECT DISTINCT t.id, t.title 
FROM threads t LEFT JOIN comments c ON t.id = c.parentID AND 
c.id = (SELECT MAX(c.id) FROM comments where comments.parentID = t.id) 
ORDER BY c.date DESC 

Dies könnte leicht mit ein paar Zeilen in Kommentaren ein wenig langsam werden. Es kann sinnvoll sein, das letzte Kommentardatum in Threads zu speichern, wenn Sie ein Leistungsproblem bemerken.

0

habe ich versucht, dies und es funktionierte wie das, was es klingt wie Sie

wollen
SELECT DISTINCT t.id, t.title FROM threads AS t LEFT JOIN comments AS c ON t.id = c.parent_id ORDER BY c.date DESC 

Die einzige wirkliche Sache, die ich geändert wurde mit

aus Fäden AS T