2014-12-02 48 views
1

我有一個像下面結合多個單查詢的WHERE以限制2每

name    |  cat 
---------------------------------------- 
ala    |  games 
alaa    |  software 
aha    |  games 
asd    |  games 
aad    |  software 
aas    |  software 
asd    |  books 
aad    |  software 
aas    |  books 

所以我有三個查詢像下面

SELECT * FROM `table` WHERE MATCH(`name`) AGAINST ('a*' IN BOOLEAN MODE) AND cat='games' LIMIT 2 
SELECT * FROM `table` WHERE MATCH(`name`) AGAINST ('a*' IN BOOLEAN MODE) AND cat='software' LIMIT 2 
SELECT * FROM `table` WHERE MATCH(`name`) AGAINST ('a*' IN BOOLEAN MODE) AND cat='books' LIMIT 2 

所以我想獲得第一2 result from each category(遊戲,電子書列,軟件)...現在我使用這三個查詢..如何將它們合併爲一個查詢..

Ps這僅僅是例子..我工作到多達10類..我想要的東西不要浪費多少資源

+0

你有主鍵嗎?以及你如何決定哪一個是第一個價值?此外,爲什麼你需要全文搜索?如果每組需要2條記錄,則可以採用更好的方法。 – 2014-12-02 14:40:28

+0

是的,我有主鍵..這僅僅是例子..我有超過百萬條記錄,我使用全文.. – 2014-12-02 14:51:38

+0

我已經創建了一個示例,以獲得每組頂部n http://sqlfiddle.com/# !2/81395/16,我不確定是否可以在那裏執行全文搜索。 – 2014-12-02 15:24:09

回答

1

假設這些查詢工作,使用UNION

SELECT DISTINCT * FROM `table` WHERE MATCH(`name`) 
    AGAINST ('a*' IN BOOLEAN MODE) LIMIT 2 WHERE cat='games' 
UNION 
SELECT DISTINCT * FROM `table` WHERE MATCH(`name`) 
    AGAINST ('a*' IN BOOLEAN MODE) LIMIT 2 WHERE cat='books' 
UNION 
SELECT DISTINCT * FROM `table` WHERE MATCH(`name`) 
    AGAINST ('a*' IN BOOLEAN MODE) LIMIT 2 WHERE cat='software' 

關於優化,documentation狀態「當結合了DISTINCT LIMIT ROW_COUNT中,MySQL就停止它找到唯一的row_count行。」所以你應該添加這個來限制單個查詢的資源。

+0

不是這個浪費資源嗎?我有超過10個類別分開... – 2014-12-02 14:07:13

+0

反正電腦必須做這個工作; MySQL比後處理(比如PHP)效率更高。最終,「LIMIT 2」使其很難以其他方式執行,例如使用「GROUP BY」。您應該檢查查詢時間以查看查詢處理需要多長時間。 – Sablefoste 2014-12-02 14:10:02