![](/img/trans.png)
[英]SQL Join tables and show default value for unmatched records in the right table
[英]Three table join with matched and unmatched records
我有三张表:
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.