Mysql
僅當兩個表上的 ID 相同時才從兩個表中選擇數據
我需要選擇返回結果
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_CONCAT
和FIND_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 ) ;