在MySQL中的子查询上使用GROUP_CONCAT

Ais*_*ina 41 mysql sql group-concat mysql-error-1242

我有一个MySQL查询,我想在其中包含另一个表中的ID列表.在网站上,人们可以添加某些项目,然后人们可以将这些项目添加到他们的收藏夹中.我基本上想要获得那些喜欢该项目的人的ID列表(这有点简化,但这就是它归结为).

基本上,我做这样的事情:

SELECT *,
GROUP_CONCAT((SELECT userid FROM favourites WHERE itemid = items.id) SEPARATOR ',') AS idlist
FROM items
WHERE id = $someid
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以通过在我的代码中进一步将id列表转换为PHP中的数组来显示谁喜欢某个项目,但是我收到以下MySQL错误:

1242 - 子查询返回超过1行

我认为这有点使用GROUP_CONCAT而不是,例如,CONCAT?我是以错误的方式来做这件事的吗?


好的,感谢到目前为止的答案,这似乎有效.然而,有一个问题.如果该项目由该用户添加,则该项目也被视为最受欢迎.所以我需要额外的检查以检查creator = userid.有人可以帮我提出一个聪明(并希望有效)的方法吗?

谢谢!

编辑:我只是试图这样做:

SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)
Run Code Online (Sandbox Code Playgroud)

IDLIST是空的.请注意,如果我使用INNER JOIN而不是LEFT JOIN我得到一个空的结果.即使我确信有些行符合ON要求.

nie*_*fir 91

OP几乎是正确的.GROUP_CONCAT应该包装子查询中的列而不是完整的子查询(我正在解雇分隔符,因为逗号是默认值):

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid
Run Code Online (Sandbox Code Playgroud)

这将产生所需的结果,也意味着接受的答案部分错误,因为您可以访问子查询中的外部范围变量.

  • 好的,我正在做同样的事情,把GROUP_CONCAT放在子查询之外,谢谢你的帮助!! (10认同)

sou*_*rge 14

您无法在此类查询中访问外部作用域中的变量(不能items.id在此处使用).你应该尝试类似的东西

SELECT
    items.name,
    items.color,
    CONCAT(favourites.userid) as idlist
FROM
    items
INNER JOIN favourites ON items.id = favourites.itemid
WHERE
    items.id = $someid
GROUP BY
    items.name,
    items.color;
Run Code Online (Sandbox Code Playgroud)

根据需要展开字段列表(名称,颜色......).