GROUP CONCAT 在子查询中不起作用 - mysql
GROUP CONCAT not working in a subquery - mysql
我编写了一个 mysql 查询,目的是根据与特定组相关的 ID 在数据库中获取一组属性。我在我的网站上使用 OpenCart 2,我的子查询如下:
SELECT GROUP_CONCAT(attribute_id) AS attr_ids
FROM oc79_attribute
WHERE attribute_group_id = 13
哪个returns:
44,45,46,47
当我在需要获取属性名称的查询中写这个时,我只得到一个结果:
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)
我只得到 attribute_id 44 的结果,而不是其他的,即使我知道记录存在。
这是解决这个问题的正确方法,还是我只是遗漏了什么?
编辑:
澄清一下,如果我写:
SELECT * FROM oc79_attribute_description WHERE attribute_id IN(44,45,46,47)
我得到了 4 条记录的正确结果。
提前致谢
不需要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
将return一个字符串以,
作为分隔符,你需要的是多个值。
如果属性 table 每个 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))
我编写了一个 mysql 查询,目的是根据与特定组相关的 ID 在数据库中获取一组属性。我在我的网站上使用 OpenCart 2,我的子查询如下:
SELECT GROUP_CONCAT(attribute_id) AS attr_ids
FROM oc79_attribute
WHERE attribute_group_id = 13
哪个returns:
44,45,46,47
当我在需要获取属性名称的查询中写这个时,我只得到一个结果:
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)
我只得到 attribute_id 44 的结果,而不是其他的,即使我知道记录存在。
这是解决这个问题的正确方法,还是我只是遗漏了什么?
编辑:
澄清一下,如果我写:
SELECT * FROM oc79_attribute_description WHERE attribute_id IN(44,45,46,47)
我得到了 4 条记录的正确结果。
提前致谢
不需要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
将return一个字符串以,
作为分隔符,你需要的是多个值。
如果属性 table 每个 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))