2015-04-06 101 views
8

我有mysql的評論表,像這樣。Mysql如何從同一個表中的單個查詢中獲取2組結果?

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| userid  | int(11)   | NO |  | 0  |    | 
| comment | char(255)  | NO |  | NULL |    | 
| content | int(11)   | NO | MUL | 0  |    | 
| ratings | int(11)   | NO |  | 0  |    | 
| datetime | datetime   | NO |  | NULL |    | 
| ip   | int(10) unsigned | NO |  | NULL |    | 
| is_updated | tinyint(2)  | NO |  | 0  |    | 
| record_num | int(11)   | NO | PRI | NULL | auto_increment | 
+------------+------------------+------+-----+---------+----------------+ 

現在我可以從這個和用戶名從另一個表中使用INNER JOIN查詢這樣取得評論。

我可以得到最高3評論ORDER BY comments.ratings DESC

SELECT comments.userid, users.username, comments.comment, comments.ratings, comments.datetime, comments.record_num , content.uploader , content.anonymous 
FROM comments 
LEFT JOIN users ON comments.userid = users.record_num 
LEFT JOIN content ON comments.content = content.record_num 
WHERE comments.content = ? ORDER BY comments.ratings DESC limit 3 

得到規則的意見ORDER BY comments.datetime DESC。

SELECT comments.userid, users.username, comments.comment, comments.ratings, comments.datetime, comments.record_num , content.uploader , content.anonymous 
FROM comments 
LEFT JOIN users ON comments.userid = users.record_num 
LEFT JOIN content ON comments.content = content.record_num 
WHERE comments.content = ? ORDER BY comments.datetime DESC limit ?, ? 

什麼,我tryingf做的是向用戶展示前3位的意見通過由comments.datetime DESC,然後再定期評價他們爲了收視率。

現在我怎樣才能將兩個mysql查詢合併成一個?

回答

9

- 這僅僅意味着連接兩個 - 你可以使用union與結果相結合結果在一起。然而需要注意的是,你不能簡單地將這兩個查詢直接結合在一起,因爲它們使用order by,所以我們需要將它們包裝在外部查詢中,並使用排名變量來確保我們可以重建聯合順序,我們希望:

select * from (
    SELECT 1 as tbl, 
      comments.userid, 
      users.username, 
      comments.comment, 
      comments.ratings, 
      comments.datetime, 
      comments.record_num, 
      content.uploader, 
      content.anonymous, 
      @rank := @rank + 1 as rank 
    FROM comments 
     LEFT JOIN users ON comments.userid = users.record_num 
     LEFT JOIN content ON comments.content = content.record_num 
     CROSS JOIN (select @rank := 0) q 
    WHERE comments.content = ? ORDER BY comments.ratings DESC limit 3 
) q1  
UNION ALL 
select * from ( 
    SELECT 2 as tbl, 
      comments.userid, 
      users.username, 
      comments.comment, 
      comments.ratings, 
      comments.datetime, 
      comments.record_num, 
      content.uploader, 
      content.anonymous, 
      @rank := @rank + 1 as rank 
    FROM comments 
     LEFT JOIN users ON comments.userid = users.record_num 
     LEFT JOIN content ON comments.content = content.record_num 
     CROSS JOIN (select @rank := 0) q 
    WHERE comments.content = ? ORDER BY comments.datetime DESC limit ?, ? 
) q2 
ORDER BY tbl asc, rank asc; 

union默認爲distinct這意味着它不會重複在兩組結果發現行,但也不能保證該行將在您所期望的順序返回,因此需要用它自己的tbl值標記每個表,然後order by那個字段。

如果你是一定不會有重複的,你可以通過使用union all消除重複檢查,而不是union

+0

感謝您的輸入什麼,就是一些大的查詢, – AMB

+0

@AMB他們是你的兩個疑問 - 我只是格式化他們不同的稍微容易閱讀。有這麼走了進去 –

+0

沒有太多額外的工作有沒有辦法,我可以顯示甚至重複的值也一樣,我的意思是如果只有3個評論,那麼它應該由comments.ratings DESC和另一組返回6個評論,第一組訂單ORDER BY comments.datetime DESC – AMB

1

要回答你的問題,是的,你可以結合使用UNION

您查詢

我想要做的是向用戶顯示前3條評論,首先評級爲 ,然後按評論順序排序,然後按照評論順序排序..datetime DESC

如果你正在努力實現類似的計算器,其中頂評論(或評論upvotes)首先顯示的評論功能的,那麼我想單獨的查詢是足夠好。

如果將您的查詢合併,則用戶需要加載所有頂級常規評論。此外,它是某種很難作出或實施分頁與具有UNION大查詢(根據我的經驗,因爲我還在上編碼一個小白)

Disclamer:很難,但不是不可能

如果我是誰要去代碼問題之一,首先我的程序將加載前3名的意見,在此之後,有一個「顯示更多評論」按鈕,將張貼到我的服務器使用AJAX和結果追加(常規評論)到顯示評論列表。就這樣,查詢必須單獨像你現在有

相關問題