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

Translate

我正在尝试以下查询:

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

那是三个查询卡在一起,有点儿。但是,返回的结果集反映了查询3的结果,而不是查询1的结果。

有什么方法可以对它们进行优先级排序,以使查询#1的结果全部相同,查询#2的结果全部相同,然后查询#3的结果全部相同?我现在还不想在PHP中执行此操作(更不用说必须控制在第一个查询中显示的结果而不在第二个查询中显示等等)。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

也许您应该尝试包括第四列,说明它来自的表格,然后对其进行排序和分组:

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
来源
Translate

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

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
来源
Translate

您可以将其作为子选择吗?

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
来源
Translate

SELECT分别与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实际上是否允许您按列分组,而仍然不对其他列进行聚合?

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

来源
Translate

如果没有一种排序方式对您想要的排序有意义,则不要将结果结合在一起-只需返回3个单独的记录集,并在您的数据层中进行相应处理即可。

来源
Translate

我最终(查看所有建议)来到了这个解决方案,这在我需要的东西和时间之间有些妥协。

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

来源
Bernice Lee
Translate

UNION有两个变体。

'UNION' and 'UNION ALL'

在大多数情况下,您真正要说的是UNION ALL,因为它不会重复消除(请考虑SELECT DISTINCT)之间的设置,可以节省大量执行时间。

其他人建议使用多个结果集,这是一个可行的解决方案,但是在时间紧迫的应用程序或通过WAN连接的应用程序中,我会提醒您这样做,因为这样做可能会导致服务器和客户端之间的线路往返明显增加。

来源
Translate

我不明白为什么需要合并以从单个表中获取数据

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
来源