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

21

我正在尝试以下查询:

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

这相当于把三个查询连在一起。但返回的结果集会先反映出第三个查询的结果,而不是我们想要的按照第一个查询、第二个查询和第三个查询的顺序显示结果。

有没有办法优先级排序,使得结果以第一个查询的结果为主,然后是第二个查询的结果,最后是第三个查询的结果?我暂时不想在PHP中实现(更别提需要控制第一个查询中出现的结果不要在第二个查询中出现等等)。

8个回答

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

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
你能否将它作为子查询来实现,类似于:
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

1

选择不同的a、b、c从以下内容中:

SELECT distinct a,b,c FROM ( SELECT A,B,C,1 as o FROM table WHERE field LIKE 'query%' UNION SELECT A,B,C,2 as o FROM table WHERE field LIKE '%query' UNION SELECT A,B,C,3 as o FROM table WHERE field LIKE '%query%' ) ORDER BY o ASC LIMIT 5

这是我的做法。我不知道它的可扩展性。

我不理解。

GROUP BY B ORDER BY B ASC LIMIT 5

它只适用于联合查询中的最后一个SELECT吗?

MySQL是否真的允许您按列分组,但仍不对其他列进行聚合?

编辑:啊哈。我看到MySQL实际上确实可以这样做。这是DISTINCT(b)的特殊版本或类似的东西。我不想尝试成为那个领域的专家 :)


0

UNION 有两个变体。

'UNION' and 'UNION ALL'

在大多数情况下,您真正想要使用的是 UNION ALL,因为它不会在集合之间执行重复消除(类似于 SELECT DISTINCT),这可以节省相当多的执行时间。
其他人建议使用多个结果集,这是可行的解决方案,但我会警告在时间敏感的应用程序或连接在广域网上的应用程序中使用此方法可能会导致服务器和客户端之间的往返传输显著增加。

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
如果没有合适的排序方式来满足您的需求,请不要将结果联合在一起 - 只需返回3个单独的记录集,并在数据层面相应地处理它们。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接