2013-03-11 100 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关系...