在 mysql WHERE 子句中使用 GROUP_CONCAT 和 FIND_IN_SET

Posted

技术标签:

【中文标题】在 mysql WHERE 子句中使用 GROUP_CONCAT 和 FIND_IN_SET【英文标题】:Using GROUP_CONCAT with FIND_IN_SET in mysql WHERE clause 【发布时间】:2019-02-14 10:13:45 【问题描述】:

我有这个查询,想使用学生电子邮件从表中获取约会数据,但收到此错误Unknown column 'stu' in 'where clause'

select a.*, GROUP_CONCAT(e.value) as stu FROM wp_ea_appointments a join
wp_ea_fields e on a.id = e.app_id WHERE a.date > DATE('2019-02-14') AND
FIND_IN_SET('jan@gmail.com' , stu ) GROUP BY a.id

【问题讨论】:

【参考方案1】:

FIND_IN_SET 条件应该包含在HAVING 语句而不是WHERE 语句中,因为您要在分组后过滤数据

SELECT a.*, 
    GROUP_CONCAT(e.value) as stu 
FROM wp_ea_appointments a 
JOIN wp_ea_fields e ON a.id = e.app_id 
WHERE a.date > DATE('2019-02-14')
GROUP BY a.id
HAVING FIND_IN_SET('jan@gmail.com', stu) 

【讨论】:

【参考方案2】:

您可以尝试使用子查询

select * from
(
select a.*, GROUP_CONCAT(e.value) as stu FROM wp_ea_appointments a join
wp_ea_fields e on a.id = e.app_id WHERE a.date > DATE('2019-02-14') 
GROUP BY a.id
)A where FIND_IN_SET('jan@gmail.com' , stu ) 

【讨论】:

【参考方案3】:

使用HAVING 子句,但要正确表述逻辑:

SELECT a.*, GROUP_CONCAT(e.value) as stu
FROM wp_ea_appointments a JOIN
     wp_ea_fields e 
     ON a.id = e.app_id
WHERE a.date > DATE('2019-02-14')
HAVING SUM( e.value = 'jan@gmail.com' ) > 0;

没有理由使用字符串连接来检查值是否存在。字符串比较更昂贵且不太清晰。

【讨论】:

以上是关于在 mysql WHERE 子句中使用 GROUP_CONCAT 和 FIND_IN_SET的主要内容,如果未能解决你的问题,请参考以下文章

在mysql select语句中使用条件where子句

MySQL group_concat 与 where 子句

在 WHERE 或 GROUP BY 子句中使用列表别名

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

MySQL?having子句

使用 Group By 作为 where 子句的一部分