【发布时间】:2021-04-01 09:04:53
【问题描述】:
在 MySQL 5.7.32 中,我想从一个产品表中检索所有产品,其中包含多个商店的这些产品的价格(如果它们可用),如果它们不可用,则应为该商店缺失的价格返回 NULL。
共有三个表:产品、价格、商店
表格:
-- table shops
id | name
1 | amazon
2 | ebay
3 | craigslist
-- table products
ARTICLE_ID | name
123 | article 1
124 | article 2
125 | article 3
-- table prices
DATE | SHOP_ID | ARTICLE_ID | PRICE
201220 | 1 | 123 | 12.99
201220 | 2 | 123 | 9.99
201220 | 1 | 124 | 10.80
201221 | 1 | 123 | 13.99
-- Desired result
SHOP | PRODUCT | PRICE
amazon | 123 | 12.99
amazon | 124 | 10.80
amazon | 125 | NULL
ebay | 123 | 9.99
ebay | 124 | NULL
ebay | 125 | NULL
SQL:
SELECT
s.name,
p.id,
mps.price
FROM
shops s,
products p
LEFT JOIN prices mps ON p.ARTICLE_ID = mps.ARTICLE_ID AND mps.DATE = 20201220
WHERE
s.ID IN ( '1' , '2')
我不知道如何为每个产品和商店显示一条线。这甚至可以通过该表设置实现,还是我需要更改我的数据库结构?
【问题讨论】:
-
如果您为每个商店创建一个
LEFT JOIN,您将在一条线上获得所有内容。 -
请把
FROM shops s, products p ...改成FROM shops s INNER JOIN products p ON s.id=p.SHOP_ID ... -
嗯,可以有很多商店,这只是一个最小的例子,所以每个商店只有一个 JOIN 不是一种选择。 WHERE IN 语句中的 id 是动态生成的。我玩过许多不同的 SQL 查询,这只是其中之一,我不知道如何解决这个问题。
-
如果你想让所有店铺都在一条线上,那么你需要创建一个PIVOT,搜索它,你会找到解决方案.....
-
不要
join使用旧的逗号分隔语法。定义您的joins 与ons 关联关系。
标签: mysql