2009-10-15 2 views
2

Мой запрос:MySQL LIMIT на LEFT JOIN

SELECT issues.*, 
      comments.author AS commentauthor, 
      comments.when_posted AS commentposted 
    FROM issues 
LEFT JOIN (SELECT * 
      FROM comments 
     ORDER BY when_posted DESC 
      LIMIT 1) AS comments ON issues.id=comments.issue 
ORDER BY IFNULL(commentposted, issues.when_opened) DESC 

Моя проблема с этим является "LIMIT 1" на третьей строчке. Это ограничивает все комментарии только новейшим, поэтому только сообщения с последним комментарием будут отправлены как комментарий вообще.

Если я удалил часть «LIMIT 1» оттуда, я бы получил строку для каждого комментария в проблеме, и это не то, что я хочу. Я хочу только новый комментарий для каждой проблемы.

В любом случае, я не уверен, что моя часть IFNULL работает даже в том случае, когда я еще не в процессе отладки.

Итак, как бы я мог достичь того, чего хотел?

+0

rexem - редактирование в мою SQL коду. .. левый интервал выглядит странно: c – unrelativity

+0

Вы имеете в виду выравнивание? –

+0

В любом случае, это намного лучше, чем раньше. –

ответ

2
SELECT issues.*, 
      comments.author AS commentauthor, 
      comments.when_posted AS commentposted 
    FROM issues 
LEFT JOIN (SELECT c1.issue, c1.author, c1.when_posted 
       FROM comments c1 
      JOIN 
      (SELECT c2.issue, max(c2.when_posted) AS max_when_posted   
       FROM comments c2 
      GROUP BY issue) c3 
      on c1.issue = c3.issue and c1.when_posted = c3.max_when_posted 
     ) AS comments ON issues.id=comments.issue 
ORDER BY COALESCE(commentposted, issues.when_opened) DESC 
+0

Предупреждение: mysql_fetch_array(): предоставленный аргумент не является допустимым ресурсом результата MySQL. О, Боже. – unrelativity

+0

Вы протестировали запрос непосредственно в 'MySql' (по крайней мере, чтобы иметь сообщение об ошибке sql, если оно есть). Ошибка 'php' может означать много вещей. – manji

+0

phpMyAdmin говорит: «# 1052 -« Ошибка столбца »в списке полей неоднозначна» – unrelativity

3

Try:

SELECT i.*, 
      c.author AS commentauthor, 
      c.when_posted AS commentposted 
    FROM ISSUES i 
LEFT JOIN COMMENTS c ON c.issue = i.id 
    JOIN (SELECT c.issue, 
        MAX(c.when_posted) 'max_when_posted' 
      FROM COMMENTS c 
     GROUP BY c.issue) mwp ON mwp.issue = c.issue 
           AND mwp.max_when_posted = c.when_posted 
ORDER BY COALESCE(c.when_posted, i.when_opened) DESC 
+0

Это работает, но у меня есть проблема в моей базе данных без каких-либо комментариев, связанных, и она не указана. В любом случае, все эти ответы несколько ... сбивают с толку. У меня есть чему поучиться .... – unrelativity

0

Редактировать

Поскольку MySql не имеет КТР-й в конце концов, попробуйте следующее:

SELECT i.* 
    c.author AS CommentAuthor, 
    c.when_posted AS CommentPosted 
FROM Issues i 
LEFT JOIN 
    (SELECT issue, MAX(when_posted) AS LastPostDate 
    FROM comments GROUP BY issue) ic ON ic.issue = i.id 
LEFT JOIN Comment c ON c.issue = i.id AND c.when_posted = ic.LastPostDate 
ORDER BY COALESCE(ic.LastPostDate, issues.when_opened) DESC 
+0

К сожалению, это не так: P – unrelativity

+0

К сожалению, MySQL не поддерживает предложение WITH. Запрос был с 2006 года :( –