MySQL在GROUP_CONCAT中使用特定号码进行HAVING

时间:2012-04-27 03:53:14

标签: mysql having

我的查询功能与魅力相似,但现在我需要使用当前位于 GROUP_CONCAT 创建的字段中的值对其进行过滤。我已经知道我可以使用HAVING进行过滤,但我无法找到要使用的语法,因为 HAVING groupconcatname LIKE '%6%' 会找到6,16,26等。我需要有声明搜索特定值,以便它可以找到" 8"在包含1,5,8,18,30,58的groupconcat中,找不到 8 AND 18 AND 58 ,因为我使用了LIKE' %%'。

我的查询(现在正常工作..但根据%6%的部分匹配找到太多结果):

SELECT offers.*, s.short_name AS sponsorName, s.logo AS sponsorLogo, GROUP_CONCAT( mn.title) titles, 
   GROUP_CONCAT( mo.`name`) metas, GROUP_CONCAT( om.meta_option) AS meta_ids
FROM offers 
INNER JOIN offer_metas as om ON om.offer_id = local_ld_offers.id 
INNER JOIN meta_options as mo ON om.meta_option = mo.id 
INNER JOIN meta_names as mn ON mo.category = mn.category AND mo.cat_seq = mn.seq 
LEFT JOIN sponsors AS s ON s.id=offers.sponsor 
GROUP BY offers.id 
HAVING meta_ids LIKE '%6%'
ORDER BY end_date ASC

我需要用更类似于HAVING meta_ids LIKE '%6%'的内容替换WHERE '6' IN meta_ids但是当我尝试替换HAVING语句时,似乎是对运行 WHERE 的合理尝试,它忽略了meta_ids是我的子句中使用的有效变量/字段并出错的事实。

有什么建议吗?

谢谢,

Silver Tiger

更新 - 解决,除非有更优雅的方式

根据以下Thomas的建议,我更新了查询,显然我可以通过使用更新的方法为每个选项添加一行来搜索所需的单个值,如下所示:

WHERE EXISTS( SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '23')
OR EXISTS( SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '16')

2 个答案:

答案 0 :(得分:2)

目前尚不清楚这里要问的是什么(一些预期输出的测试输入会有所帮助)但听起来并不像你真的需要一个Having子句。如果你想过滤om.meta_option是“喜欢”8的值,那么添加一个Where子句,如下所示:

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option = Like '%8%'
                )

当然,这会返回存在88018181的行。如果您要查找的值等于8,请使用:

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option = '8'
                )

如果您寻求的是一系列价值观,那么您可以采取以下措施:

Where Exists    (
                Select 1
                From meta_options As om1
                Where om1.meta_option = mo.id
                    And om1.meta_option In('8','23')
                )

请记住,在分组之后应用过滤器的Having子句的目的和Where子句在分组之前应用过滤器。在这种情况下,听起来应该在分组之前进行过滤,因此应该使用Where子句。

答案 1 :(得分:0)

您可以将HAVING meta_ids LIKE '%6%'更改为HAVING meta_ids LIKE '%,6,%' OR '6,%' OR '%,6' OR '6',这样可以获得您想要的内容。

替代方案包括子查询之类的东西,比如%运算符在性能方面不是很好。