如何在MySQL中连接整个结果集?
我正在尝试以下查询:
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中执行此操作(更不用说必须控制在第一个查询中显示的结果而不在第二个查询中显示等等)。
解决方案
回答
我们可以将其作为子选择吗?
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个单独的记录集,并在数据层中进行相应处理即可。
回答
添加带有硬编码值的添加列,我们将使用该列对整个结果集进行排序,如下所示:
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
回答
也许我们应该尝试包括第四列,说明它来自的表格,然后对其进行排序和分组:
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
回答
我最终(查看所有建议)来到了这个解决方案,这在我需要的东西和时间之间有些妥协。
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
回答
选择不同的a,b,c FROM(
SELECT A,B,C,1 as o FROM table WHERE field LIKE'query%'
联盟
从表WHERE字段像'%query'一样选择SELECT A,B,C,2
联盟
从表WHERE字段像'%query%'中选择SELECT A,B,C,3作为o
)
按o ASC限制5
这将是我的方式。我不知道如何扩展。
我不明白
GROUP BY B ORDER BY B ASC LIMIT 5
它仅适用于联合中的最后一个SELECT吗?
mysql实际上是否允许我们按列分组,而仍然不对其他列进行聚合?
编辑:aaahh。我看到mysql确实可以。它是DISTINCT(b)的特殊版本。我不想尝试成为该领域的专家:)
回答
UNION有两个变体。
'UNION' and 'UNION ALL'
在大多数情况下,我们真正要说的是UNION ALL,因为它不会在集合之间进行重复消除(请考虑" SELECT DISTINCT"),这可以节省大量执行时间。
其他人则建议使用多个结果集,这是一个可行的解决方案,但是在时间紧迫的应用程序或者通过WAN连接的应用程序中,我会提醒我们这样做,因为这样做可能会导致服务器与客户端之间的线路往返明显增加。