与 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_local
和uid_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_news
和uid_categories
是好名字,也有助于更好地理解m:n 关系...
【讨论】:
以上是关于与 MySQL 表的复杂 M:N 关系的主要内容,如果未能解决你的问题,请参考以下文章