2010-01-27 225 views
2

我的問題是這樣的:依賴MySQL的SELECT

我的表是MESSAGEMESSAGE_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當它是一條評論。

我希望我已經解釋清楚我的問題..

+0

評論可以以任意順序排列,還是按id排序? – 2010-01-27 12:29:35

+0

你是否真的需要你的查詢來在不同的表/列中包含像這樣的'content'字段中的值?如果你的郵件內容和評論內容的返回數據中有不同的列,你可以編寫一個更簡單的SQL查詢。 – 2010-01-27 12:49:43

回答

1
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

謝謝你的回答。 我試過查詢但它不顯示沒有評論的消息..我該如何解決這個問題? – AldoB 2010-01-27 14:32:15

+0

@unknown(yahoo):用'LEFT JOIN'替換'JOIN'。我更新了查詢。 – Quassnoi 2010-01-27 14:59:23

+0

..替換JOIN使用LEFT JOIN將所有值設置爲NULL ... – AldoB 2010-01-28 09:31:34

0

這都是因爲PHP是在服務器(側),由它生成的HTML解析到客戶端瀏覽器和獲得renderized ...

+1

似乎是錯誤的窗口:) – Quassnoi 2010-01-27 12:44:04

0

我不是工會的粉絲,但有時他們有他們的地方... :)

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 | 
+------+----+--------------------------------------------+ 

注:在UNION第二SELECT可以很容易地與INNER JOIN返工到MESSAGE表,如果孤立message_comments是一個問題。