我有一个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>"用作隔离的查询将结果列表中的项目。

我希望这可以帮助别人。干杯!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top