2012-07-17 62 views
0

我覺得有點尷尬,因爲可能有一個簡單的解決方案,但我不知道有足夠的MySQL來做到這一點。我如何使用一個查詢從每個表中獲取數據,然後返回一個數組,如下所示?我做的每一個嘗試都會返回一個標籤,或者返回多個相同任務的數組,每個數組都有不同的標籤。用一對多的關係查詢兩張表

我的查詢結構應該是什麼樣子?

謝謝!

http://i.stack.imgur.com/ViqEs.png

+2

在*「任務」(即$ result ['task'] ['tags'])中將「標籤」作爲子數組*是否更有意義?這樣,如果某個時候您想要同時檢索多個任務,則每個標籤都包含在每個「任務」元素中,而不必排成一行。 – 2012-07-17 02:53:14

+0

是的,這對我也很好。基本上我只想加入這個標記信息和任務,這樣當我顯示一個任務列表而不是一個任務列表時,我不必循環一個單獨的查詢來爲每個任務獲取標記。 任何想法查詢可能看起來像什麼? newfurniturey的解決方案是好的,但我希望儘可能避免爆炸線。 – AgmLauncher 2012-07-17 03:13:23

+0

要以您想要的方式獲取數據,您只有三種直接選擇(我所看到的)。 1)執行兩個單獨的查詢(一個用於任務,一個用於標籤)。 2)使用'LEFT JOIN'執行一個查詢,但不執行'GROUP_CONCAT()' - 結果將會是一個二維數組,其每個列除了'tag_name'外都有重複的數據。你需要遍歷整個數組並存儲單個標籤。 3)使用'GROUP_CONCAT()'和'explode()'。如果我可能會問,爲什麼爆炸是一個問題? – newfurniturey 2012-07-17 03:29:03

回答

2

圖像的數組實際上顯示了數據如何看起來像兩個查詢,而不是一個後。爲了能夠在單個查詢中完成,這是因爲數據不是太複雜,您可以使用GROUP_CONCAT()獲取任務的所有標記,然後使用後查詢邏輯將數據拆分爲單獨的數組。

的SQL查詢來獲取所有請求的數據將是:

SELECT 
    tasks.*, GROUP_CONCAT(tag_name) AS tags 
FROM 
    tasks LEFT JOIN tags ON tags.task_id=tags.id 
WHERE 
    id=2 

這個查詢將返回一個記錄;在該記錄中,列tags將保存屬於該任務的所有標籤的以逗號分隔的列表。您可以將該列中的數據拆分爲數組以構建您所需的結構。

一個例子,用PHP:

$result = mysql_query("SELECT tasks.*, GROUP_CONCAT(tag_name) AS tags FROM tasks LEFT JOIN tags ON tags.task_id=tags.id WHERE id=2"); 

// create the "$task" array that has a "task" and "tags" index 
$task = array('task' => array(), 'tags' => array()); 
$task['task'] = mysql_fetch_assoc($result); 

// split the comma-separated list of tags into an array 
$task['tags'] = explode(',', $task['task']['tags']); 

// delete the original "tags" entry that's returned by the sql query 
unset($task['task']['tags']); 

請注意,這個例子是任何數據驗證的空隙,連接信息,或其它邏輯,應該只作爲一個粗略的想法如何,你可能分裂數據到你想要的結構。

+0

如果沒有標籤名稱可以包含逗號(','),'GROUP_CONCAT'可能是您最好的選擇。 – 2012-07-17 03:08:26

+0

這可以通過使用'SEPARATOR'來解決,比如'GROUP_CONCAT(tag_name SEPARATOR'|')'使管道字符|是定界符而不是逗號。 – newfurniturey 2012-07-17 03:22:04