2014-12-02 50 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