题
我想出以下查询:
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只是还没有(没有提到具有控制结果表明了在第一个查询不会显示在第二等等)。
解决方案
也许你应该尝试包括一个四分列,说明表它来自何方,并随后以和组通过:
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 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 * 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
选择不同的a、b、c( 选择A,B,C,1作为o从表在场像'询%' 联盟 选择A,B,C,2作为o从表在场LIKE'%查询 联盟 选择A,B,C,3o从表在场LIKE'%查询%' ) 为通过o ASC限制5
将是我的方式做到这一点。我不知道怎么说的尺度。
我不明白的
GROUP BY B ORDER BY B ASC LIMIT 5
它不仅适用于最后选择的联盟?
不mysql实际上允许你组由列仍然做不了聚集在另列?
编辑:aaahh.我看到mysql实际上没有。它是一种特殊版本的独特(b)或东西。我不想尝试是专家在这一领域:)
如果没有一种有意义了他们,你的愿望,不联盟的结果一起-只是回3个单独的记录,并处理与他们相应地在你的数据层。
我终于(在所有建议)来到这解决方案,它的一个点之间的妥协什么,我需要时间。
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
有两个的一些变体的联盟。
'UNION' and 'UNION ALL'
在大多数情况下是你真正想要说的是联盟所有,因为它没有做消除重复(觉得 SELECT DISTINCT
)之间设置这可能会导致相当多的节约条款的执行时间。
其他人建议的多个结果集,这是一个可行的解决办法但是我要告诫这在时间上敏感的应用或应用程序连接到广域网,因为这样做可能导致明显更多的往返上的电线之间的服务器和客户。
我不明白为什么需要的联盟,用于把数据从单一表
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