2013-03-11 96 views
4

我有以下表格:複雜的M:N與MySQL表關係

:新聞
領域:UID,標題,類別,日期時間,隱藏,刪除

:categories_mn
字段:uid_local,uid_foreign

:類
領域:UID,parentcategory,名稱,圖像

每一個新聞條目都被分配到幾個不同的類別。

什麼我試着去實現的是,以獲得最新3日消息,並顯示該項目被分配到所有類別的圖像(且分配有一個圖片)

事情是這樣的:

title | catimages   | 
------------------------------ 
Post 7 | cat1.jpg   | 
Post 6 |      | 
Post 5 | cat1.jpg,cat3.jpg | 
------------------------------ 

這是我到目前爲止有:

SELECT title, categories 
FROM news 
WHERE deleted = 0 AND hidden = 0 AND 
ORDER BY datetime DESC 
LIMIT 3; 

我不是很有經驗的SQL。請幫忙。

+2

什麼是「類別」字段?還有什麼是'uid_local'和'uid_foreign'? – Hast 2013-03-11 17:52:48

+0

'categories'字段是M:N關係表的uid_local。另一個字段是類別表的uid。 – 2013-03-11 18:04:42

+1

@Dbugger如果你想拼接你的catimages,也就是說如果你想得到cat1.jpg,cat3.jpg,請使用group_concat。查看http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field – 2013-03-11 18:24:40

回答

0
select b.title, b.categories, a.image from categories a 
inner join news b 
on a.uid=b.uid 
WHERE b.deleted = 0 and b.hidden = 0 
order by a.datetime desc 
limit 3; 
+0

太棒了!謝謝! – 2013-03-11 18:02:28

+0

我沒有將此標記爲解決方案。這不工作。它應該從一開始就很明顯,因爲你不會使用任何mn表格 – 2013-03-13 10:30:16

+0

你總是標記不正確的答案嗎? – Hituptony 2013-03-13 12:28:24

0

我不認爲你需要在新聞表中的類別欄。 我覺得這個查詢應該工作:

SELECT 
    news.title, 
    categories.image 
FROM 
    news 
    INNER JOIN categories_mn ON news.uid=categories.uid_local 
    INNER JOIN categories ON categories.uid=categories_mn.uid_foreign 
WHERE 
    news.hidden=0 AND news.deleted=0 
ORDER BY 
    datetime DESC 
LIMIT 3 

我也想在categories_mn重命名列,以便它更清晰的列是指表。也許uid_newsuid_categories是好名字,這也有助於更好地理解m:n關係...