2011-11-21 84 views
0

我有一个相当复杂的查询,并且遍布整个地方的大量连接。查询本身完美工作,通过适当的ID分组来显示不同的值,并且我使用GROUP BY来解释COUNT()字段,并且我有3个包含序列号的字段。搜索并返回与组中的搜索匹配的行

问题是,让我们假设有3行共享相同的ID。每个这三列的具有三个序列号列不同的序列号,类似于下面:

Row  ID  SN1  SN2  SN3 
1  1  abc123 (null) (null) 
2  1  (null) def456 (null) 
3  1  (null) (null) xyz789 

在分组-由ID,第一行会出现在记录集,这是很好的,但它也意味着如果我做了LIKE '%def%',该行根本不会出现。

MySQL是首先执行WHERE部分还是GROUP BY?它似乎是第一个分组,这就是为什么只有一个LIKE '%abc%'工作。有什么方法可以交换这个订单吗?

真正的查询是60行,所以我不想粘贴它,但会,如果它是绝对必要的。

回答

1

WHEREGROUP BY之前被应用。

如果要先筛选,然后使用WHERE条件进行筛选。 如果您想先GROUP BY,然后过滤,使用HAVING子句。

如果您想要结果中的所有序列号,则可以在聚合阶段使用SELECT GROUP_CONCAT(SN1) AS all_sn1。有关本手册中的GROUP_CONCA的更多信息。

如果您想要将一列中所有三列的所有序列号连接在一起。一种可能的方式:

SELECT COALESCE(GROUP_CONCAT(SN1) || ' ', '') 
    || COALESCE(GROUP_CONCAT(SN1) || ' ', '') 
    || COALESCE(GROUP_CONCAT(SN1), '') 

可能有一个尾随。 Trim如果你在意。

+0

谢谢,这让我走上了正确的道路。不知何故,我忽略了这个功能(正如我以前使用过的那样)......我希望能够进行精确匹配搜索,但宁愿它正在工作:) +1 – David