簡體   English   中英

MYSQL從同一個表中選擇並連接多個where AND子句

[英]MYSQL select and join multiple where AND clauses from the same table

有一個產品表和一個產品標簽表。
嘗試選擇所有包含所有標簽的產品。 因此,當用戶優化搜索時,他們只會獲得包含所有標簽的產品。

標簽

id              PID       tag
------------------------------
0c212c04_Gold   0c212c04  Gold
0c212c04_500g   0c212c04  500g
0c212c04_Coin   0c212c04  Coin

最初我嘗試了ORIN ,但這帶回了所有結果。 即使他們只有1個必需的標簽

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag = 'Gold' OR pt.tag = '10oz' AND p.RRP BETWEEN 0 AND 1000000

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag IN ('Gold','10oz') AND p.RRP BETWEEN 0 AND 1000000

所以我嘗試了AND它帶來了0結果。

SELECT DISTINCT p.* 
FROM products p
INNER JOIN product_tags pt ON (p.PID = pt.PID)
WHERE pt.tag = 'Gold' AND pt.tag = '10oz' AND p.RRP BETWEEN 0 AND 1000000

如何帶回所有具有Gold10oz以及Coin多個標簽的產品?

您可以使用HAVING子句:

SELECT p.* 
FROM products p JOIN
     product_tags pt 
     ON p.PID = pt.PID
WHERE pt.tag IN ('Gold', '10oz') AND 
      p.RRP BETWEEN 0 AND 1000000
GROUP BY p.PID  -- okay assuming PID is unique/primary key
HAVING COUNT(*) = 2;

這是一個依賴於條件聚合並且可以處理任意數量條件的選項(只需向HAVING子句添加更多條件):

SELECT p.id
FROM products p
INNER JOIN product_tags pt ON p.PID = pt.PID
WHERE p.rrp BETWEEN 0 AND 1000000
GROUP BY p.id
HAVING MAX(pt.tag = 'GOLD') = 1 AND MAX(pt.tag = '10oz') = 1

注意:如果您需要更多products列,則需要在SELECT GROUP BY子句中添加它們(這不會影響查詢結果,因為主鍵product.id已經是非聚合的一部分列)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM