MySQL表中的复杂M:N关系

4
我有以下表格:
表格:新闻
字段:uid、标题、类别、日期时间、隐藏、已删除
表格:分类_mn
字段:本地uid、外部uid
表格:分类
字段:uid、父类别、名称、图像
每个新闻条目可以分配给几个不同的类别。
我想要实现的是获取最新的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
categories 字段是什么?同时 uid_localuid_foreign 是什么? - ozahorulia
categories 字段是 M:N 关系表的 uid_local。另一个字段是 categories 表的 uid。 - Enrique Moreno Tent
1
@Dbugger 如果你想要连接你的catimages,即如果你想要获取cat1.jpg,cat3.jpg,请使用group_concat。请参见https://dev59.com/CXVC5IYBdhLWcg3wfhOL。 - Mr. Radical
那确实是正确答案,Radical先生。请将其放在答案中,这样我就可以给你信用了 :) - Enrique Moreno Tent
2个回答

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;

我取消了将此标记为解决方案。这个方法不起作用。从一开始就应该很明显,因为您根本没有使用mn表。 - Enrique Moreno Tent
不好意思,我执行了你的查询,它“看起来”运行良好。但经过进一步测试,我意识到我被正确的输出所欺骗,这只是巧合的结果。 - Enrique Moreno Tent
非常好。很抱歉我不能提供更多的帮助,看起来你已经在上面找到了答案^^。祝你好运。 - Hituptony

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_news和uid_categories是不错的名称,可以更好地理解m:n关系...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接