我有三个表:事件、事件和用户。事件表存储与特定事件相关的信息(名称、日期等),用户表存储用户信息(名称、年龄等),事件表是两者之间的关系,仅存储Event_ID和User_ID。
我需要列出特定用户的所有事件(假设User_ID = 20),并在每个事件中显示所有其他用户。
例如,假设用户要去“Steve的生日”、“返校派对”和“艺术展市中心”。我需要显示:
史蒂夫的生日-还有:萨拉,迈克,汤姆的返校派对-还有:迈克,安迪,罗杰,史蒂夫艺术展市中心-还有:萨拉
我尝试先查询数据库,在Events表中查找与User_ID匹配的所有Event_ID,然后获取该数组,并分别找到event_name和event_date。但我太迷惑自己了,试图弄清楚如何找到每个也去参加活动的人。
有没有人能理解我在做什么,并提出一个方法来完成它?
发布于 2010-01-29 16:41:44
您可以在in子句中使用subselect,如下所示:
SELECT `event`.*, `user`.* from `user`,`user_event`, `event`
WHERE `event`.`id` in (
SELECT `user_event`.`event_id` from `user_event`, `user`
WHERE `user`.`id` = ?
)
AND `user`.`id` = `user_event`.`user_id`
AND `user_event`.`event_id` = `event`.`id`
ORDER BY `event`.`id`它基本上是这样的:查找所有要参加以下事件的用户-事件列表可以通过获取joe将要参加的事件的event_ids来找到。
在子选择中,我没有拉入事件表,因为我从多对多表中获得了足够的信息( event_id)。
行中将有冗余数据。您将希望通过迭代各行来对结果数组进行后期处理。
$groupedArray = array();
foreach ($result as $item)
{
if(!isset($groupedArray[$item['event_id']])
{
// Create an empty array if we don't have one for this grouping yet.
$groupedArray[$item['event_id']] = array();
}
// Append the current item to the subarray.
$groupedArray[$item['event_id']][] = $item;
}这种循环实际上是非常惯用的。您可能希望编写/查找一个通用的"regroup“函数。
发布于 2010-01-29 16:42:52
就像这样
SELECT
e.Name,
Concat_WS(', ', u.Name) AS AlsoGoing
/* maybe some more stuff */
FROM
Events eu
LEFT JOIN Events a
ON (eu.Event_ID = a.Event_ID)
LEFT JOIN Users u
ON u.User_ID = a.User_ID
LEFT JOIN Event e
ON (eu.Event_ID = e.Event_ID)
WHERE
eu.User_ID = 20 /* or some other ID */
AND a.User_ID <> eu.User_ID
GROUP BY
eu.Event_ID; 第一个连接创建了“还有谁要参加同一个活动”的关系。where-子句过滤掉相同的用户(如果列表是为Steven创建的,那么他不会出现在"who and‘s going“中),并且只选择Steven参加的活动。第二个和第三个连接只是将用户和事件信息添加到ID中。使用(分隔)对事件进行分组可以确保每个事件都有一行( "people also up")。
https://stackoverflow.com/questions/2160716
复制相似问题