【问题标题】:SQL get results by condition from multi table joibsSQL 从多表连接中按条件获取结果
【发布时间】:2021-10-21 20:50:22
【问题描述】:

我想从 1 个或多个表中获取与连接条件匹配的结果。

我希望查询只返回颜色为蓝色和白色且品牌为 my_brand_1 的产品

这是我的小提琴:

https://www.db-fiddle.com/f/urA3kbd9JeYed7xGUEWref/2

CREATE TABLE colors (
  prodoct_id CHAR(250),
  name CHAR(250)
);
INSERT INTO colors (prodoct_id, name) VALUES ('prodoct_1', 'blue');
INSERT INTO colors (prodoct_id, name) VALUES ('prodoct_1', 'white');
INSERT INTO colors (prodoct_id, name) VALUES ('prodoct_2', 'blue');
INSERT INTO colors (prodoct_id, name) VALUES ('prodoct_2', 'green');

CREATE TABLE brands (
  prodoct_id CHAR(250),
  name CHAR(250)
);
INSERT INTO brands (prodoct_id, name) VALUES ('prodoct_1', 'my_brand_1');
INSERT INTO brands (prodoct_id, name) VALUES ('prodoct_2', 'my_brand_2');

CREATE TABLE prodocts (
  prodoct_id CHAR(250)
);
INSERT INTO prodocts (prodoct_id) VALUES ('prodoct_1');
INSERT INTO prodocts (prodoct_id) VALUES ('prodoct_2');

SELECT 
    prodocts.prodoct_id
FROM 
    prodocts
    
LEFT OUTER JOIN     
    colors
 ON (colors.name = 'blue' AND prodocts.prodoct_id = colors.prodoct_id)
     AND (colors.name = 'white' AND prodocts.prodoct_id = colors.prodoct_id)

LEFT OUTER JOIN     
    brands
 ON (brands.name = 'my_brand_1' AND brands.prodoct_id = colors.prodoct_id)

【问题讨论】:

  • 这是一个非常奇怪的数据库布局,产品表不应该是品牌和颜色的关键,而不是相反吗?是否有一个原因?在产品中添加颜色和品牌会更有意义
  • 否,因为您可以拥有超过 1 种颜色或品牌

标签: sql postgresql


【解决方案1】:

我的查询只返回 bluewhiteproducts 并且他们的品牌是 my_brand_1(只返回满足所有三个条件的产品):

SELECT p.prodoct_id
FROM prodocts p
INNER JOIN colors c1 ON p.prodoct_id = c1.prodoct_id AND c1.name = 'blue'
INNER JOIN colors c2 ON p.prodoct_id = c2.prodoct_id AND c2.name = 'white'
INNER JOIN brands b ON b.prodoct_id = p.prodoct_id AND b.name = 'my_brand_1';

您的查询接近要求的结果。

更新:“每个表都有一个连接”

SELECT prodoct_id
FROM (SELECT DISTINCT p.prodoct_id, b.name, c.name
      FROM prodocts p
      INNER JOIN colors c ON p.prodoct_id = c.prodoct_id AND (c.name = 'blue' OR  c.name = 'white')
      INNER JOIN brands b ON b.prodoct_id = p.prodoct_id AND b.name = 'my_brand_1') AS sq
GROUP BY prodoct_id    
HAVING count(*) = 2;

假设您没有重复的颜色行。

SELECT p.prodoct_id
FROM prodocts p
INNER JOIN (SELECT prodoct_id
            FROM colors 
            WHERE name IN ('blue', 'white')
            GROUP BY prodoct_id
            HAVING count(*) = 2) AS c ON p.prodoct_id = c.prodoct_id
INNER JOIN brands b ON b.prodoct_id = p.prodoct_id AND b.name = 'my_brand_1';

【讨论】:

  • 我想要每个表都有一个单独的连接,可以吗?
  • 是的@dasdasd,我更新了我的答案。有多种方法可以进行您想要的查询。
  • 不客气@dasdasd!
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多