搜索并返回与组中的搜索匹配的行

时间:2011-11-21 09:37:01

标签: mysql group-by

我有一个相当复杂的查询,到处都有大量的连接。查询本身运行正常,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部分还是先执行GR​​OUP BY?看起来它首先是分组,这就是为什么只有LIKE '%abc%'才有效。有没有办法交换该订单?

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

1 个答案:

答案 0 :(得分: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), '')

可能有一个尾随的sapce。 Trim如果你关心的话。{/ p>