【问题标题】:How to use LEFT JOIN with WHERE on three tables?如何在三个表上使用 LEFT JOIN 和 WHERE?
【发布时间】: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


【解决方案1】:

ON 子句中,您还必须定义shopsprices 之间的链接:

SELECT
    s.name,
    p.ARTICLE_ID,
    mps.price
FROM
    shops s CROSS JOIN products p
    LEFT JOIN prices mps 
    ON s.id = mps.shop_id AND p.ARTICLE_ID = mps.ARTICLE_ID  AND mps.DATE = 201220
WHERE
    s.ID IN ( '1' , '2')
ORDER BY s.name, p.ARTICLE_ID 

请参阅demo
结果:

> name   | ARTICLE_ID | price
> :----- | ---------: | ----:
> amazon |        123 | 12.99
> amazon |        124 |  10.8
> amazon |        125 |  null
> ebay   |        123 |  9.99
> ebay   |        124 |  null
> ebay   |        125 |  null

【讨论】:

  • 不错!感谢您的帮助,我今天学到了一些新东西,以前从未听说过 CROSS JOIN。
  • @merlin 您的查询使用以下语法进行了 CROSS JOIN:FROM shops s, products p 但这是一个过时的语法。我更喜欢在加入时使用显式语法。您的代码的问题是您错过了在 LEFT 连接的 ON 子句中使用商店和价格的关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多