我有一个相当复杂的查询,到处都有大量的连接。查询本身运行正常,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行,所以我真的不想粘贴它,但如果它是绝对必要的话。
答案 0 :(得分:1)
WHERE
在GROUP 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>