簡體   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