繁体   English   中英

三表连接匹配和不匹配的记录

[英]Three table join with matched and unmatched records

我有三张表:

  • 店铺
  • article_to_store
  • 文章表。
    CREATE TABLE store (
    `id` int(10) unsigned NOT NULL,
    `name` varchar(20) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    CREATE TABLE article_to store (
    `id` int(10) unsigned NOT NULL,
    `article_id` int(10) unsigned NOT NULL,
    `store_id` int(10) unsigned NOT NULL,
    `Price`....,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    CREATE TABLE article (
        `id` int(10) unsigned NOT NULL,
        `name` varchar(20) NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我需要所有带有商店名称的文章。 对于所有文章,我想列出所有商店

store表包含 3 个商店。 article表包含 2 篇文章。

article_to_store关系表可能有 2 条记录。 2家店铺1种。

我需要一个带有这个结果的 mysql 查询:

商店名称 article_to_store.id 文章名
店铺 1 1 钢笔
店铺 2 2 钢笔
店铺 3 空值 钢笔
店铺 1 空值 擦除
店铺 2 空值 擦除
店铺 3 空值 擦除
SELECT store.name, article.name, article_to_store.id 

FROM store, article_to_store, article 

Group by store.id, article.id
ORDER BY article.id, store.id

如果我使用简单连接 article_to_store 表总是 id = 1

如果我使用 LEFT JOIN,不要得到不匹配的记录。

当我删除该组时,我得到了 12 条记录。

3 个商店 * 2 个 article_to_store * 2 个文章 = 12 条记录。 那对我不好。

如果存在,我想用 article_to 存储数据的 3 个商店 * 2 个文章 = 6 个记录。

我尝试了很多连接类型,但它不起作用。 感谢您的任何想法。

您可以使用cross join来实现这一点。

SELECT s.name, ats.id, a.name
FROM article a
CROSS JOIN store s
LEFT JOIN article_to_store ats ON a.id = ats.article_id AND s.id = ats.store_id
ORDER BY a.id, s.id

有点不寻常的情况,但在这里,您本质上是在问“对于每篇文章,我想列出所有商店 - 这是一个cross join ”。 然后为了获得中间列,您只是有时期望返回一行,这是一个left join

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM