mysql - 从表 A 中查找与数据透视表 B 另一侧的表 C 具有某些 JOINS 的记录,但不查找其他记录

标签 mysql join

我有 3 个表 productsproduct_storesstoresstores 表中只有几个条目,而 product_stores 记录基本上意味着我们知道特定商店出售特定产品。

我们想要找到的是在商店 2、3、4、5 中出售但不在商店 9 中出售的一组产品。

这是我到目前为止所得到的,不确定我是否走在正确的轨道上,但看起来有点接近。我已经获得了我们知道某个产品存在的所有记录,但无法获取该产品未 JOIN(ed) 的商店...

SELECT s.id AS store_id, ps.id AS product_store_id, p.id AS product_id
FROM stores s
LEFT JOIN product_stores ps ON ps.store_id = s.id
RIGHT JOIN products p ON p.id = ps.product_id AND p.id = 8
HAVING store_id IN (2, 3, 4, 5, 9)

这会产生

+----------+------------------+------------+
| store_id | product_store_id | product_id |
+----------+------------------+------------+
|        2 |           178455 |          8 |
|        3 |                8 |          8 |
|        4 |           178454 |          8 |
|        5 |           178453 |          8 |
+----------+------------------+------------+

我想看到的是这个

+----------+------------------+------------+
| store_id | product_store_id | product_id |
+----------+------------------+------------+
|        2 |           178455 |          8 |
|        3 |                8 |          8 |
|        4 |           178454 |          8 |
|        5 |           178453 |          8 |
|        9 |             NULL |          8 |
+----------+------------------+------------+

或者因为我真的只想要一个唯一的product_id列表,可以将其展平为具有唯一product_id的结果集。

我们正在使用 MySQL。您应该能够从我当前的查询中看到表之间的关系,但如果您需要其他信息,则可以通过 LMK 看到。 AND p.id = 8 仅用于限制测试目的的结果集。

最佳答案

内连接应该可以解决这个问题:

SELECT ps.product_id
FROM stores s INNER JOIN
     product_stores ps
     ON ps.store_id = s.id 
GROUP BY ps.product_id
HAVING SUM(store_id = 2) > 0 and
       SUM(stored_id = 3) > 0 and
       SUM(stored_id = 4) > 0 and
       SUM(stored_id = 5) > 0 and
       SUM(stored_id = 9) = 0;

having 子句中的每个条件都会测试该产品是否位于其中一家商店。 sum() 计算商店中的行数,> 0 表示商店 2-5 至少有一个。 = 0 表示该产品不在商店 9 中。

关于mysql - 从表 A 中查找与数据透视表 B 另一侧的表 C 具有某些 JOINS 的记录,但不查找其他记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541866/

相关文章:

mysql - 无法在mamp环境中使用root@localhost连接到mysql数据库

mysql - MySQL 上的极慢选择查询

join - Spark 数据帧 reduceByKey

sql - 多表有序 GROUP BY 或 Distinct SQL

python - 使用条件在 python pandas 中进行内部连接

MySQL - 在单独的列中显示两个内部联接

mysql - 按日期名称和名称求和表,同时有时间间隔

java - 关闭连接池中的数据库连接

php - 使用 group concat 插入 Select

mysql - 查询是否可以改进,因为它会出现超时异常