mysql - 查找未与另一个 id 关联的 id 的 SQL 查询
问题描述
我目前正在学习 SQL 的技巧,并且我有一个学校的教程是这样的:所有商店 (storeid) 销售 (productid, storeid) 一些产品 (productid) 如果商店销售的每件产品都不是由任何其他商店出售。如何找到垄断?我正在考虑从 2 个相同的表中选择 storeid,但我不确定如何从那里继续。
表格如下:
店铺:
+-----------+
| storeid |
+-----------+
| --------- |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-----------+
产品:
+-------------+
| productid |
+-------------+
| --------- |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+-------------+
销售:
+--------------------------+
| productid | storeid |
+--------------------------+
| -----------+------------ |
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 1 | 2 |
| 3 | 3 |
| 2 | 4 |
| 4 | 4 |
| 5 | 5 |
| 6 | 5 |
+--------------------------+
所以根据我的统计,只有 5 号商店被认为是垄断的,因为他们销售的产品在其他商店没有。
解决方案
我们可以尝试结合聚合的自连接方法:
SELECT t1.storeid
FROM yourTable t1
LEFT JOIN yourTable t2
ON t2.productid = t1.productid AND
t2.store_id <> t1.storeid
GROUP BY t1.storeid
HAVING COUNT(t2.storeid) = 0;
这里的方法是尝试将每一行Sells
与其他行匹配,条件是它是相同的产品,但正在由其他商店出售。匹配的商店是其产品没有被其他商店出售的商店,因此连接中第二个表列的计数应该为零。
推荐阅读
- python - Python:按值的排序顺序打印键和值
- clang - 如何调用clangd来格式化文件
- akka - Akka Cluster Sharding - 集群内的不同实体可以相互通信吗?
- flutter - 如何阻止模糊滤镜对模糊图像周围的颜色进行采样?
- flutter - 在 Dart Flutter 中将 Unix/epoch 时间戳转换为人类可读的时间
- xml - Prometheus 导出器将 xml 输出转换为名称-值对
- xtext - Xtext 到 Acceleo
- javascript - 每隔几秒 GET 请求
- javascript - React-Dropzone 未将文件上传到 AWS S3
- azure - 在启动应用程序之前检查 Azure 存储连接字符串的有效性