繁体   English   中英

SQL:多对多关系和'ALL'子句

[英]SQL: many-to-many relationship and the 'ALL' clause

我有一个表products和一张桌子locations ,其在一个表中的许多一对多的关系联系在一起products_locations 现在,客户可以选择一组产品,我想运行一个只选择所有选定产品的位置的查询。

起初这看起来很简单,但我发现自己对如何实现这一点感到非常困惑。 我最初认为我可以用类似的东西获得所有正确的位置ID

SELECT location_id
FROM products_locations
WHERE product_id = ALL [the user selected product ids]

但是第二种想法似乎也没有意义( products_locations的结构很简单[product_id, location_id]

任何有关如何构建此类查询的建议都将受到赞赏。 我觉得我忽略了一些基本的东西..

编辑:我使用的是mysql语法/方言

快速样本:给出以下表格

| products   | | locations | | products_locations       |
| id | name  | | id | name | | product_id | location_id |
|------------| |-----------| |--------------------------|
| 1  | prod1 | | 1  | locA | | 1          | 2           |
| 2  | prod2 | | 2  | locB | | 2          | 1           |
| 3  | prod3 | |-----------| | 2          | 2           |
|------------|               | 3          | 1           |
                             |--------------------------|

如果用户选择产品1和2,则查询应仅返回位置2.如果用户选择产品2和3,则查询应返回位置1.对于1,2和3,没有位置有效,对于产品2,两个地点都有效。

我想出了一个能够实现我需要的查询。 虽然它不像我希望的那样干净,但它似乎是我正在尝试查询的一种强有力的方法:

SELECT t.location_id
FROM (SELECT location_id, COUNT(*) as n_hits
      FROM products_locations
      WHERE product_id IN [the user selected products]
      GROUP BY location_id) t
WHERE n_hits = [the number of user selected products];

说明:

  1. 我创建了一个临时表t ,其中包含每个location_id ,其中包含用户选择中至少一个匹配产品,以及该位置与用户选择中的产品匹配的次数。 这是通过按location_id对查询进行分组来实现的。
  2. 我从该临时表t选择location_id ,其中命中数等于用户选择的产品数。 如果该数字较低,我知道至少有一个产品与该位置不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM