使用GROUP_CONCAT上查询在MySQL
-
22-08-2019 - |
题
我有一个MySQL查询,在其中,我想要包括一个列表中的身份证是从另一个表中。在网站上,人们能够增加某些项目,人们可以再添加这些项目对他们的最爱。我基本上想要获得的列表的身份的人收藏最多的项目(这是一位简化,但是这是什么它归结)。
基本上,我做这样的事情:
SELECT *,
GROUP_CONCAT((SELECT userid FROM favourites WHERE itemid = items.id) SEPARATOR ',') AS idlist
FROM items
WHERE id = $someid
这样,我就可以显示谁收藏最多的一些项目,通过分裂的idlist后,一系列在PHP进一步对在我的代码,但是我得到以下MySQL error:
1242-查询的回报超过1行
我认为这是一种点的使用 GROUP_CONCAT
相反的,例如, CONCAT
?我会对这种错误的方式?
Ok,谢谢你的回答迄今为止,似乎工作。然而,有一个陷阱。项目还被认为是一个喜欢的,如果它加入的用户。所以我需要一个额外的检查,以检查,如果造物主=userid。有人可以帮我想出了一个聪明(并希望高效率的)方式做到这一点?
谢谢你!
编辑:我只是试图做到这一点:
SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)
和 idlist 是空的。请注意,如果我使用 INNER JOIN
而不是的 LEFT JOIN
我得到一个空空的结果。虽然我肯定有行,满足该要求。
解决方案
您不能访问在这样的查询外部范围变量(不能使用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;
展开字段列表根据需要(名称,颜色...)。
其他提示
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
这将产生所期望的结果,并且还意味着接受的答案是部分错误的,因为可以在一个子查询访问外部范围的变量。
我想你可能有“用户ID =为itemid”错了,它不应该是这样的:
SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId) AS IdList
FROM FAVOURITES
INNER JOIN ITEMS ON (ITEMS.Id = FAVOURITES.ItemId OR FAVOURITES.UserId = ITEMS.Creator)
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID
GROUP_CONCAT的目的是正确的,但子查询是不必要的,导致了问题。尝试这个代替:
SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId)
FROM FAVOURITES INNER JOIN ITEMS ON ITEMS.Id = FAVOURITES.ItemId
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID
是的,soulmerge的解决方案是确定的。但我需要查询在我必须收集数据的更多的孩子表格,例如:
- 主要表: 会议 (介绍会议)(uid,name,..)
- 1儿童表: 事件 与关键session_id(uid,session_uid、日期、time_start,time_end)
- 2子表: accessories_needed (笔记本电脑、投影仪、话筒等)。 与关键session_id(uid,session_uid,accessory_name)
- 3儿童表: session_presenters (演讲人)与关键session_id(uid,session_uid,presenter_name、地址...)
每届会议上有更多的行儿童表表(更多的时间安排,更多的配件)
我需要收集在一个收集每一个会议显示,在矿石的行(一些):
session_id | session_name | date | time_start | time_end | accessories | presenters
我的解决方案(后多小时的实验):
SELECT sessions.uid, sessions.name,
,(SELECT GROUP_CONCAT( `events`.date SEPARATOR '</li><li>')
FROM `events`
WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS date
,(SELECT GROUP_CONCAT( `events`.time_start SEPARATOR '</li><li>')
FROM `events`
WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_start
,(SELECT GROUP_CONCAT( `events`.time_end SEPARATOR '</li><li>')
FROM `events`
WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_end
,(SELECT GROUP_CONCAT( accessories.name SEPARATOR '</li><li>')
FROM accessories
WHERE accessories.session_id = sessions.uid ORDER BY accessories.name) AS accessories
,(SELECT GROUP_CONCAT( presenters.name SEPARATOR '</li><li>')
FROM presenters
WHERE presenters.session_id = sessions.uid ORDER BY presenters.name) AS presenters
FROM sessions
所以没有加入或组通过必要的。另一个有用的东西显示的数据的友好(当"呼应"他们):
- 你可以包裹的事件。日期,time_start,time_end等"<UL><LI> ...</LI></UL>"因此"<LI></LI>"用作隔离的查询将结果列表中的项目。
我希望这可以帮助别人。干杯!