GROUP CONCAT不在子查询中工作 - mysql

时间:2015-11-11 16:17:36

标签: mysql sql opencart group-concat

我有一个mysql查询,我编写了这个查询,以便根据与特定组相关的ID获取数据库中的一组属性。我在我的网站上使用OpenCart 2,我的子查询如下:

grp :: Ord b => [(b,c)] -> [(b,[c])]
grp xs = do
    b <- (nub . sort . map fst) xs 
    let cs = [c' | (b',c') <- xs, b'==b]
    return (b,cs)

返回:

  

44,45,46,47

当我在需要获取属性名称的查询中写这个时,我只得到一个结果:

SELECT GROUP_CONCAT(attribute_id) AS attr_ids 
FROM oc79_attribute 
WHERE attribute_group_id = 13

我只从attribute_id 44获得结果,而不是其他人,即使我知道记录存在。

这是解决这个问题的正确方法吗,还是我错过了什么?

编辑:

澄清,如果我写:

SELECT * 
FROM oc79_attribute_description 
WHERE attribute_id IN(SELECT GROUP_CONCAT(attribute_id) AS attr_ids 
                      FROM oc79_attribute WHERE attribute_group_id = 13)

我得到4条记录的正确结果。

提前致谢

2 个答案:

答案 0 :(得分:3)

不需要GROUP_CONCAT

SELECT * 
FROM oc79_attribute_description 
WHERE attribute_id IN(SELECT attribute_id AS attr_ids 
                      FROM oc79_attribute
                      WHERE attribute_group_id = 13);

看到之间的区别:

WHERE attribute_id IN ('44,45,46,47')     -- one string

WHERE attribute_id IN ('44','45','46','47')  -- multiple values

GROUP_CONCAT将返回一个以,为分隔符的字符串,您需要的是多个值。

答案 1 :(得分:1)

如果属性表每个attribute_id只有一行,那么您可以使用简单连接: -

SELECT oc79_attribute_description.* 
FROM oc79_attribute_description 
INNER JOIN oc79_attribute 
ON oc79_attribute_description.attribute_id = oc79_attribute.attribute_id 
AND oc79_attribute.attribute_group_id = 13

如果它有倍数,那么你可以使用DISTINCT: -

SELECT DISTINCT oc79_attribute_description.* 
FROM oc79_attribute_description 
INNER JOIN oc79_attribute 
ON oc79_attribute_description.attribute_id = oc79_attribute.attribute_id 
AND oc79_attribute.attribute_group_id = 13

如果你真的想搜索一串逗号分隔的值(我真的会反对它),那么你可以使用FIND_IN_SET: -

SELECT * 
FROM oc79_attribute_description 
WHERE FIND_IN_SET(attribute_id, (SELECT GROUP_CONCAT(attribute_id) AS attr_ids 
                      FROM oc79_attribute WHERE attribute_group_id = 13))