2009-08-07 2 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"; 

} 

У кого-нибудь может возникнуть проблема с этим кодом? Это не работает, как я хочу. Я хочу, чтобы это нить, которая была комментировал в последней на вершине, а следующая последняя т.д.Помощь с этим JOIN

эхо $ нить [ParentID] не повторяет ничего

комментарии:
идентификатор, комментарий, ParentID, дата

+1

темы, безусловно, имеет элементы ? Я обычно делаю полный LEFT OUTER JOIN, а также – RiddlerDev

+0

да у меня есть куча нитей и комментариев – 2009-08-07 17:44:53

+0

@OP: Не могли бы вы пояснить часть «Это не сработает, как я хочу»? – Eric

ответ

2

Вы заказываете колонку не в своем списке DISTINCT.

Это допустимый синтаксис в MySQL, однако этот ORDER BY не имеет смысла.

Этот синтаксис является MySQL extension, этот запрос не сработает ни в одном другом двигателе большой четверки RDBMS.

Он используется для упрощения DISTINCT и GROUP BY запросов в тех случаях, когда такое же значение column в SELECT или ORDER BY всегда соответствует тому же значению столбца в GROUP BY или DISTINCT.

Если ваш случай, вы можете иметь несколько значений c.date для каждого значения t.id, и какое значение c.date будет выбраны ORDER BY далеко не гарантировано (это может быть последним значением, то первое значение или любым другим стоимость).

Перепишите запрос, как это:

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

не могу получить эту работу. # 1064 - ... использовать near 'ON c.parentID = t.id ORDER BY c.date DESC' в строке 5 – 2009-08-07 18:08:00

+0

'@ Pryztojny': исправлено. Было бы проще проверить синтаксис, если бы вы разместили определения таблиц. – Quassnoi

+0

@Quassnoi - почему вы говорите, что ORDER BY на столбце не в списке выбора не имеет смысла? Кажется, это работает отлично для меня в MySQL 5.0. Можете ли вы предоставить ссылку на документацию, где описано это поведение? – ChssPly76

0

Попробуйте выполнить запрос в браузере MySQL Query на своих данных и посмотрите, вернет ли он какие-либо результаты. Если это так, то проблема связана с вашим эхом, а не с вашим запросом.

+0

он возвращается, но он не будет заказывать, как я хочу, последняя прокомментированная тема сверху – 2009-08-07 17:46:48

-1

я точно не знаю, что вы пытаетесь достичь, но если вы хотите, чтобы повторить ParentID, вам необходимо включить его в запросе.

$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

Я не использовал MySQL некоторое время, так что это то, что я знаю, работает в tSQL. Вы можете попробовать:

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 

Это может быть легко немного медленным с большим количеством строк в комментариях. Возможно, имеет смысл хранить последнюю дату комментария в потоках, если это возможно, если вы заметили проблему с производительностью.

0

Я попробовал это, и она работала как то, что это звучит, как вы хотите

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 

Единственная вещь, которую я изменил использовал

из ниток AS T

Смежные вопросы