我有 3 个表 products
、product_stores
和 stores
。 stores
表中只有几个条目,而 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/