我有一个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条记录的正确结果。
提前致谢
答案 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))