我有三張表:
- 店鋪
- 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 個記錄。
我嘗試了很多連接型別,但它不起作用。感謝您的任何想法。
uj5u.com熱心網友回復:
您可以使用 across 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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/355972.html
上一篇:為什么cast,convert在圓形、floor在以下情況下不起作用
下一篇:檢查嵌套物件中是否存在布林值
