我如何在MySQL中连接整个结果集?

我正在尝试以下查询:

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

这是三个查询粘在一起,有点不同。但是,返回的结果集反映了来自查询#1的结果之前来自查询#3的结果,这是不希望的。

有没有什么方法可以优先考虑这些因素,以便查询#1,查询#2和查询#3的全部结果全部结束。我不想在PHP中这样做(更不用说必须控制第一个查询中显示的结果而不显示在第二个等等中)。

0

6 答案

你可以把它作为一个子选择,就像

select * from (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5
0
额外

添加一个硬编码值的附加列,您将使用这些值对整个结果集进行排序,如下所示:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
0
额外

也许你应该尝试包括第四列,说明它来自哪个表,然后按顺序排序:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5
0
额外

如果没有一种有意义的顺序来排列它们,不要将结果联合在一起 - 只要返回3个独立的记录集,并在数据层中相应地处理它们。

0
额外

我最终(看到所有的建议)来到这个解决方案,它是我需要和时间之间的一种妥协。

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

它总共提供了5个结果,从第四个“列”中分类并给我我需要的东西;一个自然的结果集(通过AJAX发布)以及紧跟其后的通配符结果集。

:)

/ MP

0
额外

SELECT distinct a,b,c FROM(         SELECT A,B,C,1作为o FROM表WHERE字段LIKE'查询%'         联盟         SELECT A,B,C,2作为o FROM表where字段LIKE'%query'         联盟         SELECT A,B,C,3作为o FROM表WHERE字段LIKE'%query%'     )     ORDER BY ASC LIMIT 5

将是我的方式。我不知道这是如何衡量的。

我不明白

GROUP BY B ORDER BY B ASC LIMIT 5

它是否仅适用于联合中的最后一个SELECT?

MySQL实际上是否允许您按列进行分组,而不在其他列上进行聚合?

编辑:aaahh。我看到mysql实际上是这样做的。它是DISTINCT(b)的特殊版本。我不想尝试成为这方面的专家:)

0
额外