Зависимый MySQL SELECT - PullRequest
       14

Зависимый MySQL SELECT

2 голосов
/ 27 января 2010

Моя проблема заключается в следующем:

Мои таблицы MESSAGE и MESSAGE_COMMENT,

MESSAGE (id,content)

MESSAGE_COMMENT (id, message_id, content)

Мне нужно выбрать все сообщения и макс. 3 комментария для каждого сообщения, как в этом примере:

type | id | content
M      15   "this is a message with no comments"
M      16   "this is another message with many comments"
R      16   "comment1"
R      16   "comment2"
R      16   "comment3"
M      17   "this is another message with no comments"

"id" - это MESSAGE.id, когда это сообщение, и COMMENT.message_id, когда это комментарий.

Надеюсь, я четко объяснил свою проблему ..

Ответы [ 3 ]

1 голос
/ 27 января 2010
SELECT  *
FROM    (
        SELECT  m.id,
                COALESCE(
                (
                SELECT  id
                FROM    message_comment mc
                WHERE   mc.message_id = m.id
                ORDER BY
                        mc.message_id DESC, id DESC
                LIMIT 2, 1
                ), 0) AS mid
        FROM    message m
        ) mo
LEFT JOIN
        message_comment mcd
ON      mcd.message_id >= mo.id
        AND mcd.message_id <= mo.id
        AND mcd.id >= mid

Создайте индекс для message_comment (message_id, id), чтобы он работал быстро.

См. Эту статью в моем блоге для более подробного объяснения того, как это работает:

0 голосов
/ 22 ноября 2010

Я не фанат профсоюзов, но иногда они имеют свои места ...:)

SELECT type, id, content FROM ( 
SELECT 'M' AS type, id, 0 AS reply_id, content FROM MESSAGE
UNION
SELECT 'R' AS type, message_id AS id, id AS reply_id, content FROM MESSAGE_COMMENT) a 
ORDER BY id, reply_id

возвращает

+------+----+--------------------------------------------+
| type | id | content                                    |
+------+----+--------------------------------------------+
| M    | 15 | this is a message with no comments         |
| M    | 16 | this is another message with many comments |
| R    | 16 | comment1                                   |
| R    | 16 | comment2                                   |
| R    | 16 | comment3                                   |
| M    | 17 | this is another message with no comments   |
+------+----+--------------------------------------------+

Примечание: второе SELECT в UNION может быть легко переделано с помощью INNER JOIN в MESSAGE таблицу, если потерянные сообщения message_comments были проблемой.

0 голосов
/ 27 января 2010

Это все из-за того, что PHP анализируется на вашем сервере (стороне), а сгенерированный им HTML-код отправляется в браузер клиента и обновляется ...

...