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

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

有没有办法对这些进行优先级排序,以便查询 #1 的结果全部出现,然后查询 #2 的结果全部出现,然后查询 #3 的结果全部出现?我还不想在 PHP 中执行此操作(更不用说必须控制在第一个查询中显示的结果而不在第二个查询中显示,依此类推)。

4

8 回答 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
于 2008-08-06T18:59:36.467 回答
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
于 2008-08-06T18:55:45.243 回答
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
于 2008-08-06T18:54:23.157 回答
1

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) 或其他东西的特殊版本。我不想尝试成为该领域的专家:)

于 2008-08-06T19:41:52.607 回答
0

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

于 2008-08-06T18:54:27.587 回答
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

于 2008-08-06T19:19:53.993 回答
0

UNION 有两种变体。

'UNION' and 'UNION ALL'

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

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

于 2008-09-17T16:21:48.967 回答
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
于 2019-05-20T05:14:44.530 回答