【问题标题】:Complicated M:N relationship with MySQL tables与 MySQL 表的复杂 M:N 关系
【发布时间】: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。见stackoverflow.com/questions/276927/…
  • 这确实是答案,激进先生。把它放在一个答案中,这样我就可以给你信用:)

标签: mysql sql


【解决方案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 关系...

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2020-04-21
    • 2021-10-12
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多