2010-11-20 74 views
2

我使用codeigniter爲自己的PHP編寫了一個電影存檔腳本。我從IMDb獲取電影信息並將它們添加到我的數據庫中。我使用另一個名爲links的表格爲我選擇的電影添加鏈接。將行作爲另一個表的陣列連接到每行

這是我使用的從數據庫中獲得電影查詢:

$movies = $this->db->query("SELECT * 
    FROM movies 
    ORDER BY ".$order['by']." ".$order['type']." 
    LIMIT ".$limit.", " . $this->config->item('moviePerPage') 
); 

,我取它的視圖文件是這樣的:

foreach ($movies->result() as $row) { 
    echo $row->name; 
} 

現在鏈接必須顯示爲每部電影都帶有匹配的ID(電影可能有多個鏈接)。我的鏈接表有這些列:'id','movieid','name','鏈接'

如何獲得每個電影的鏈接與單個MySQL查詢?獲取與當前$ row電影相關的所有鏈接並將它們綁定到單個變量作爲數組是否是可行的?與此我可以循環與foreach()並顯示每個電影的鏈接。

btw:movies.movi​​eid和links.movi​​eid列具有相同的數據。

回答

3

我想你需要MySQL的GROUP_CONCAT

做這樣的事情: -

SELECT 
    movies.*, 
    group_concat(links.link ', ') as links 
FROM movies 
LEFT JOIN links 
ON links.movieid = movies.movieid 
GROUP BY movies.movieid 

你會得到一個逗號分隔的爲每部電影的鏈接列表。 ,你可以提取這樣的: -

foreach ($movies->result() as $row) { 
    $linksArray = explode(",",$row->links); 
} 

更新 我覺得這是你可以得到的結果,而不必爲單個電影通過多條鏈路的多個結果行的唯一途徑。

只要注意可以在結果中獲得的最大字符長度 - 默認情況下爲1024個字符。閱讀此 Mysql group_concat_max_lengthGroup concat max length瞭解如何覆蓋限制。

就像丹·格羅斯曼已經發現的那樣,如果你覺得鏈接可能包含逗號,可以使用不同的或不常見的分隔符。

+0

鏈接可以在其中包含逗號。你在做什麼不屬於SQL。創建數據結構和顯示邏輯屬於應用程序。 – 2010-11-21 00:35:04

+0

@Dan Grossman - 如果逗號是一個問題,可以使用其他一些罕見的分隔符,如'%% @@ && @@ %%'它不屬於SQL? group_concat是一個mysql子句,它是這樣使用的。我不是在這裏強加我的答案,但這有什麼問題。用戶只需要小心這些陷阱,就這些了。 – 2010-11-21 12:53:23

+0

爲了成功運行查詢,我必須在'',''之前使用'SEPARATOR'。 [見文檔](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)。 – 2015-03-04 08:15:17

0

加入這兩個表,就像您的問題名稱所暗示的一樣。

SELECT 
    movies.*, 
    links.* 
FROM movies 
LEFT OUTER JOIN links 
ON links.movieid = movies.movieid 
... 

您將在每個電影鏈接對中獲得一行。如果電影中沒有鏈接,則只有電影信息和與鏈接表相對應的列中的空值會得到一行。

如果需要,您可以循環播放這些結果,並將每部電影的鏈接放入由電影鎖定的陣列中。

+0

我試過了,但發生了一個問題。如果有2個與該電影相關的鏈接,它將創建兩個相同的電影數組。可能導致像這樣?:$ movie ['name'],$ movie ['movieid'],$ movie ['links'] [0,1 ...] ['name'] – Valour 2010-11-20 10:49:17

+0

@Spelljack,檢查我的答案。這樣,即使電影有多個鏈接,每部電影也會得到單個結果 – 2010-11-20 10:58:34

+0

這不是問題。這就是關係數據庫的工作原理。您需要編寫代碼將其轉換爲您想要的數組。 – 2010-11-21 00:35:46

相關問題