2

我有一个像魅力一样工作的查询,但现在我需要按当前在已GROUP_CONCAT创建字段中的值对其进行过滤。我了解到我可以使用 HAVING 进行过滤,但我找不到要使用的语法,因为HAVING groupconcatname LIKE '%6%'会找到 6、16、26 等。我需要让语句搜索特定值,以便它可以在groupconcat 包含1,5,8,18,30,58但找不到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 语句时,似乎是对正常运行的WHEREmeta_ids的合理尝试,它忽略了在我的子句中使用的有效变量/字段这一事实并出错.

有什么建议吗?

谢谢,

银虎

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

根据下面 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')
4

2 回答 2

3

目前尚不清楚这里到底要问什么(一些带有预期输出的测试输入会有所帮助),但听起来您并不需要Having 子句。如果您想过滤 sayom.meta_option为“like” 8 的值,则添加一个 Where 子句,如下所示:

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

当然,这会返回存在880和的18181。如果您正在寻找一个等于 的特定值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 子句。

于 2012-04-27T04:17:04.237 回答
0

您可以更改HAVING meta_ids LIKE '%6%'HAVING meta_ids LIKE '%,6,%' OR '6,%' OR '%,6' OR '6'which 应该得到您正在寻找的东西。

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

于 2012-04-27T03:58:45.240 回答