2010-01-29 21 views
0

我有三個表格:事件,事件和用戶。 Event表存儲與特定事件(名稱,日期等)相關的信息,Users表存儲用戶信息(名稱,年齡等),Events表是兩者之間的關係,僅存儲Event_ID和User_ID。如何從多個關係型MySQL表中輸出多維數組?

我需要列出特定用戶的所有事件(可以說User_ID = 20),並顯示所有其他用戶誰也是在每個下方的事件。

例如,可以說用戶將要參加「史蒂夫的生日」,「回家派對」和「藝術展覽中心」。我需要顯示:

史蒂夫的生日 - 也要去:莎拉,邁克,湯姆 頌黨 - 也要去:邁克,安迪,羅傑,史蒂夫 藝術展市中心 - 也要去:薩拉

我我們先試着查詢數據庫,找到Events表中與User_ID匹配的所有Event_ID。然後我拿這個數組,併爲每個查找event_name和event_date。但我很困惑自己,想方設法找出每個人也去參加這個活動。

任何人都可以理解我想要做什麼,並提出一種方法來拉它?

回答

2

可以在條款和一些使用子查詢在這樣的:

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` 

這基本上寫着:找到所有的用戶去下面的事件 - 事件的列表可以通過取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; 

} 

這種循環實際上非常習慣。你可能想寫/找到一個通用的「重組」功能。

+0

Woops。不知道我從哪裏得知你使用php的想法。 如果您使用的是python,那麼已經有一個用於itertools內部分組的工具。 – Koobz 2010-01-29 08:46:36

+0

也許你從php標記中得到了這個想法...雖然我沒有看到它在其他地方提到的問題。 – Martijn 2010-01-29 08:58:14

+0

謝謝你們,我感謝你的幫助。我可能應該在我的問題中提到PHP,很高興你選擇了這個。我嘗試了兩種方法,但我仍然遇到了一個問題,試圖循環並打印出響應以獲得所需的輸出。你有可能給我一個基本的例子嗎? – 2010-01-29 18:38:42

2

喜歡的東西

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制定的,則他不會出現在「其他人將去」的位置),並且只會選擇Steven出席的活動。第二次和第三次加入只需將用戶和事件信息添加到ID中。按事件分組使用(分隔)可確保每個事件獲得一行(「人們也將總結」)。

+1

這是更高效的,以及我的建議的sql only版本。如果你沒有使用用戶名稱列表並且沒有擴展信息 - 這將會很好。 – Koobz 2010-01-29 08:49:42

+0

@Koobz:謝謝。當然,您可以將任何關於事件的信息添加到查詢中。如果你想了解關於人員的詳細信息(不能由組函數處理),你確實需要刪除「GROUP BY」並使用後處理。 – Martijn 2010-01-29 08:52:06