Mysql

僅當兩個表上的 ID 相同時才從兩個表中選擇數據

  • January 29, 2022

我需要選擇返回結果

SELECT wl.id FROM wishlist AS wl
LEFT JOIN wishlist_products AS wp ON wl.id = wp.wishlist_id

僅當所有 wp.product_id 都存在於 wishlist_products_bought.product_id 時

謝謝

嘗試這個:

SELECT wl.id 
FROM wishlist AS wl
LEFT JOIN wishlist_products AS wp ON wl.id = wp.wishlist_id
WHERE  wp.product_id in (select product_id from wishlist_products_bought)

假設這些是您的表定義(簡化到最低限度):

CREATE TABLE wishlist
(
   wishlist_id integer PRIMARY KEY
) ;

CREATE TABLE products
(
   product_id integer PRIMARY KEY
) ;

CREATE TABLE wishlist_products
(
   wishlist_id integer NOT NULL REFERENCES wishlist(wishlist_id),
   product_id integer NOT NULL  REFERENCES products(product_id),
   PRIMARY KEY (wishlist_id, product_id)
) ;

CREATE TABLE wishlist_products_bought
(
   wishlist_id integer NOT NULL REFERENCES wishlist(wishlist_id),
   product_id integer NOT NULL  REFERENCES products(product_id),
   PRIMARY KEY (wishlist_id, product_id)
) ;

這些是您的數據:3 個產品,2 個願望清單。願望清單之一 (1) 包含“購買”的所有產品,另一個沒有 (2)。

INSERT INTO wishlist
VALUES (1), (2) ;

INSERT INTO products
VALUES (10), (20), (30) ;

INSERT INTO wishlist_products
VALUES (1, 10), (1, 20), (2, 10), (2, 20), (2, 30) ;

INSERT INTO wishlist_products_bought
VALUES (1, 10), (1, 20), (2, 20) ;

如果我理解您的目標:您正在嘗試使用所有已“購買”的產品來辨識願望清單。這可以通過一些set邏輯來完成。基本上,您要確保願望清單中的所有產品的集合完全包含在購買的產品列表中(對於同一個願望清單)。要檢查是否完全包含,您可以執行 A - B =(空集)。這可以在 SQL 中使用EXCEPT. 所以,這個查詢會做到這一點:

SELECT
    wishlist_id
FROM
    wishlist w
WHERE
    NOT EXISTS
    ( SELECT product_id FROM wishlist_products wp        
       WHERE wp.wishlist_id = w.wishlist_id
      EXCEPT
      SELECT product_id FROM wishlist_products_bought wb 
       WHERE wb.wishlist_id = w.wishlist_id
    ) ;

您可以在http://rextester.com/YOUE97199上查看 (使用 PostgreSQL 而不是 MySQL)。

有一個問題:這不適用於 MySQL,因為 MySQL 不理解EXCEPT(也沒有任何等價物);wishlist_id並且在WHERE子查詢中不理解。NOT EXISTS這意味著不能使用等效的 using 。

為了克服這些限制,我們可以使用兩個函式GROUP_CONCATFIND_IN_SET,並使用以下(我喜歡更複雜的)查詢:

SELECT
   wishlist_id, product_id_list
FROM
(
   SELECT
       w.wishlist_id,
       (SELECT
            GROUP_CONCAT(wb.product_id SEPARATOR ',')
        FROM
            wishlist_products_bought wb
        WHERE
            wb.wishlist_id = w.wishlist_id
        ORDER BY
            product_id
        ) AS product_id_list
   FROM
       wishlist w
) AS q1 
WHERE
   NOT EXISTS
   (
       SELECT 
           product_id 
       FROM 
           wishlist_products wp
       WHERE 
           wp.wishlist_id = q1.wishlist_id
           AND FIND_IN_SET(product_id, product_id_list) = 0
   ) ;

您也可以在http://rextester.com/OLKK85405查看

引用自:https://dba.stackexchange.com/questions/164298