与 MySQL 表的复杂 M:N 关系

Posted

技术标签:

【中文标题】与 MySQL 表的复杂 M:N 关系【英文标题】:Complicated M:N relationship with MySQL tables 【发布时间】:2013-03-11 17:41:28 【问题描述】:

我有以下表格:

表格:新闻字段:uid、标题、类别、日期时间、隐藏、删除

表格:categories_mn字段:uid_local、uid_foreign

表格:类别字段: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 不是很有经验。请帮忙。

【问题讨论】:

categories 字段是什么?还有uid_localuid_foreign是什么? categories字段是M:N关系表的uid_local。另一个字段是类别表的 uid。 @Dbugger 如果你想连接你的catimages,即如果你想得到cat1.jpg,cat3.jpg,使用group_concat。见***.com/questions/276927/… 这确实是答案,激进先生。把它放在一个答案中,这样我就可以给你信用:) 【参考方案1】:
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 表 没有。我执行了您的查询,它“似乎”工作正常。但经过进一步测试,我意识到我被正确的输出所欺骗,巧合。 很好..对不起,我无法提供更多帮助,看来您已经在上面找到了答案^^。欢呼【参考方案2】:

我认为您不需要新闻表中的类别列。 我认为这个查询应该有效:

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 关系...

【讨论】:

以上是关于与 MySQL 表的复杂 M:N 关系的主要内容,如果未能解决你的问题,请参考以下文章

连接两个表的复杂 SQL 查询

四大最短路径算法比较

图上 DFS 的时间复杂度 (O(V+E)) 与矩阵上的 DFS (3^(M*N))

mysql复杂查询

mysql

SQL 查询时间复杂度 - 连接与子查询