[英]How to select rows from a table by selecting combination of related data in a particular column? MySQL
我有一張桌子
桌子
4c4fedf7 OMoy3Hoa
4c4fedf7 yiWDGB4D
broe4AMb A9rLRawV
broe4AMb mi9rLmZW
nhrtK9ce yEsBoYLj
rEEtK9gt A9rLRawV
rEEtK9gt mi9rLmZW
rEEtK9Hh A9rLRawV
rEEtK9Hh msBWz8CQ
如果我輸入A9rLRawV
, mi9rLmZW
。 我想要類似的輸出;
broe4AMb
rEEtK9gt
輸出是A9rLRawV
和mi9rLmZW
組合的結果。 在這里, broe4AMb
和rEEtK9gt
在rEEtK9gt
都具有關聯的A9rLRawV
和mi9rLmZW
。 我進行了查詢,但是得到了類似的輸出;
broe4AMb
rEEtK9gt
rEEtK9Hh
我的查詢就像;
SELECT DISTINCT prodid
FROM tablea
WHERE tagid IN ('A9rLRawV','mi9rLmZW');
輸出是這樣的,因為我認為reetK9Hh
在tablea中具有A9rLRawV
關聯的A9rLRawV
。 但是我不希望該條目出現,因為它沒有與mi9rLmZW
相關聯的條目。
這是SQL小提琴http://sqlfiddle.com/#!9/12223/2/0
是否需要自連接。 什么是最“有效”的方法? 是否可以單獨使用MySQL或通過PHP的支持來實現? 我該怎么做/解決這個問題?
我堅信,僅通過SQL即可解決此問題。 從數據庫中獲取所需的數據。 讓PHP進行演示。 為什么? 通常,數據庫可以比通過Web服務器/中間件服務器上的代碼更快地解析數據。
至於如何...閱讀上having
條款,並group by
:
我在這里所做的是按prodID分組,以確保返回所有prodID。 MySQL擴展了group by子句,雖然它可能允許在沒有group by的情況下存在hading子句,但是如果沒有按prodid進行分組,則不會獲得所需的結果。 具有在哪里獲得的兩個標簽的不同計數。 注意:我在tagID的計數上添加了distinct
,因為我不確定您的總體數據是否可以為每個prodid重復tagID。 如果我們知道價值觀是不同的,我們可以消除它。
如果需要,可以根據提供的TagID數量動態設置#。
SELECT prodid
FROM tablea
WHERE tagID in ('A9rLRawV','mi9rLmZW')
GROUP BY prodid
HAVING count(distinct tagID)=2
我更喜歡這種方法,因為它可能比您需要的自我連接更好地擴展。 傳入兩個參數:一個用於標簽,一個用於標簽數量。 (我這樣做是希望您的PHP使用參數化查詢)對於自連接,您必須編寫動態SQL來處理每個附加標記,因此,如果您還有3、4,5個連接。 這樣,您只需傳入5個值和5。 並獲取所有匹配項的列表。
就像您假設的那樣,自我加入會有所幫助。 使用此查詢
SELECT a.prodid
FROM tablea AS a
INNER JOIN tablea AS b
ON a.prodid = b.prodid
WHERE a.tagid = 'A9rLRawV' and b.tagid = 'mi9rLmZW'
在這里,您將表與自身連接起來,匹配對具有A9rLRawV
(在主表a
)和mi9rLmZW
(在連接表b
)。
這是您更新的SQL提琴: http ://sqlfiddle.com/#! 9/12223/13
結果如期:
broe4AMb
rEEtK9gt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.