我正在尝试以下查询:

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

===============>>#1 票数: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

===============>>#2 票数: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

===============>>#3 票数:2

你可以做一个subselect,像这样的东西

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

===============>>#4 票数:1

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

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

我不明白

GROUP BY B ORDER BY B ASC LIMIT 5

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

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

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

===============>>#5 票数:0

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

===============>>#6 票数: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

===============>>#7 票数: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

===============>>#8 票数:0

UNION有两个变种。

'UNION' and 'UNION ALL'

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

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

  ask by mauriciopastrana translate from so

未解决问题?本站智能推荐: