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

基本上,我是这样做的:

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

这样,我就可以通过在代码中进一步将idlist拆分为PHP中的数组来显示谁喜欢某个项目,但是我得到了以下MySQL错误:

1242 - Subquery returns more than 1 row

我想这就是为什么要用GROUP_CONCAT而不是,比如说,CONCAT?我走错方向了吗?


好的,谢谢你迄今为止的答案,这似乎很有效.然而,有一个trap .如果由该用户添加,则项目也被视为最受欢迎的项目.所以我需要额外判断creator=userid.有人能帮我想出一个聪明的(希望是高效的)方法来做到这一点吗?

非常感谢.

编辑:我只是试着这么做:

SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)

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

推荐答案

在这样的查询中,您不能访问外部范围中的变量(不能使用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;

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

Mysql相关问答推荐

S优化联接更新的最佳方式是什么?

MySQL多连接以获得单个结果集(使用MySQL max函数)

如何使用GROUP BY调优简单SQL查询

带有值分隔的MySQL分组不起作用

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

MySql部分匹配基于部分查询代码

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

使用 JOIN 计算列中的所有值

MySQL过滤食谱上的多对多 - 成分表

MySQL - 计算行重复的最大计数

如何将表的链接列转换为 SQL 中的行?

MySQL中两个时间字段的分钟差

SQL UPDATE中的str_replace?

在 MySQL 中检测 utf8 损坏的字符

mysql中float(2,2)和float()的区别

我可以在单个 Amazon RDS 实例上创建多少个数据库

MySQL中的行值增加和减少1

MySQL - 错误 1045 - 访问被拒绝

电话号码和地址的mysql数据类型

在 MySQL 中存储 IPv6 地址