gpt4 book ai didi

php - 连接三个表时,MySQL 不返回任何内容。两个表在第三个表中有外键。怎么了?

转载 作者:搜寻专家 更新时间:2023-10-30 22:11:04 25 4
gpt4 key购买 nike

下面的结构和查询非常简单,但是我不明白为什么我没有得到任何结果:

SELECT * FROM `comment` 
JOIN post ON comment.source_id = post.id
JOIN article ON comment.source_id = article.id

这是一个 SQL fiddle :http://sqlfiddle.com/#!9/a9143/2

我有表“article”、“post”和comment(在我的真实数据库中这是另一回事,我只是在做这里的一个例子)。在“comment”表中,我有外键“source_id”,将此评论表与“article”和“post”表。这是因为 articles 和 post 的 id 是唯一的,永远不会冲突。

我的意思是,如果你看一下我的 fiddle 示例,你会看到帖子 ID 是 2001 和 2002,而文章 ID 是 3001 和 3002。并且永远不会有 ID 为 3001 的帖子或 ID 为 2001 的文章(我知道您可能认为这会发生,但实际上不会,因为在实际系统中,这些 ID 不会自动递增)。

如您所见,我想从所有 3 个表中选择数据,但我什么也没得到。输出应该是这样的:

id      source_id   text                id      title
1 2001 First comment 2001 First post
2 2002 Second comment 2002 Second Post
3 3001 Third comment 3001 First article
4 3002 Comment on article 3002 Second article

我做错了什么吗?或者这是不可能的?

最佳答案

您的数据库结构暗示了从 commentpost 以及从 commentarticle 的关系。您需要分别对待这些,然后将两者合并:

SELECT * FROM `comment` 
JOIN post ON comment.source_id = post.id
UNION
SELECT * FROM `comment`
JOIN article ON comment.source_id = article.id

这将适用于您的示例,因为联合的每一半的列格式都是兼容的。但是,如果您的实际用例有不同的列,您最好重新设计您的数据库。您可以采用两种方法:

  • written_work 表(或任何你想给它起的名字)上有一个 type 列来确定它是一篇文章还是一篇文章。这仅在所有(或至少大部分)列可用于所有类型时才有效。
  • 或者,如果各种类型的格式不同,可能值得将您的公共(public)字段放在 written_work(我称之为公共(public)表或集合表)中,然后添加“特化”表如有必要。这些包含仅在文章或帖子中使用的字段,并且每种书面工作类型都有一个。 written_work 与指定类型的专家表之间的关系是 1:1。

如果您可以避免“重复使用”外键,您将能够使用外键约束,这将使您对数据的完整性更有信心。您当前的设计是不可能的。

关于php - 连接三个表时,MySQL 不返回任何内容。两个表在第三个表中有外键。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28931267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com