[英]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];
說明:
t
,其中包含每個location_id
,其中包含用戶選擇中至少一個匹配產品,以及該位置與用戶選擇中的產品匹配的次數。 這是通過按location_id
對查詢進行分組來實現的。 t
選擇location_id
,其中命中數等於用戶選擇的產品數。 如果該數字較低,我知道至少有一個產品與該位置不匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.