Помогите с этим ПРИСОЕДИНИТЬСЯ - PullRequest
1 голос
/ 07 августа 2009
$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";

}

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

echo $ thread [parentID] ничего не повторяет

комментарии:
id, комментарий, parentID, дата

Ответы [ 5 ]

2 голосов
/ 07 августа 2009

Вы заказываете по столбцу, которого нет в вашем списке DISTINCT.

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

Этот синтаксис является MySQL расширением , этот запрос не будет выполнен в любом другом 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 голосов
/ 07 августа 2009

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

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

0 голосов
/ 07 августа 2009

Я некоторое время не использовал 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 голосов
/ 07 августа 2009

Я не уверен, что именно вы пытаетесь достичь, но если вы хотите повторить 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 голосов
/ 07 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...