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

时间:2008-08-06 18:47:24

标签: mysql sql union

我正在尝试以下查询:

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中这样做(更不用说必须控制第一个查询中显示的结果,而不是在第二个查询中显示等等)。

8 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

添加一个附加列,其中包含用于对整个结果集进行排序的硬编码值,如下所示:

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

答案 2 :(得分:2)

你可以做一个子选择,比如

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

答案 3 :(得分:1)

SELECT distinct a,b,c FROM(         选择A,B,C,1作为o FROM表WHERE字段LIKE'query%'         联盟         选择A,B,C,2作为o FROM表WHERE字段LIKE'%query'         联盟         选择A,B,C,3作为o FROM表WHERE字段LIKE'%query%'     )     订购ASC限制5

这是我的方式。我不知道那种尺度如何。

我不明白

GROUP BY B ORDER BY B ASC LIMIT 5

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

mysql实际上是否允许您按列进行分组,但仍然不在其他列上进行聚合?

编辑:aaahh。我看到mysql确实存在。它是DISTINCT(b)的特殊版本。我不想尝试成为该领域的专家:)

答案 4 :(得分:0)

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

答案 5 :(得分: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

答案 6 :(得分:0)

我不明白为什么需要合并以从单个表中获取数据 SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

答案 7 :(得分:0)

UNION有两个变种。

'UNION' and 'UNION ALL'

在大多数情况下,你真正想说的是UNION ALL,因为它不会在集合之间进行重复消除(Think SELECT DISTINCT),这可以在执行时间方面节省相当多的时间。

其他人提出了多个结果集,这是一个可行的解决方案,但是我会在时间敏感的应用程序或通过WAN连接的应用程序中提醒您这样做,因为这样做会导致服务器和客户端之间的线路往返更多。