簡體   English   中英

如何通過選擇特定列中相關數據的組合來從表中選擇行? 的MySQL

[英]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

如果我輸入A9rLRawVmi9rLmZW 我想要類似的輸出;

broe4AMb
rEEtK9gt

輸出是A9rLRawVmi9rLmZW組合的結果。 在這里, broe4AMbrEEtK9gtrEEtK9gt都具有關聯的A9rLRawVmi9rLmZW 我進行了查詢,但是得到了類似的輸出;

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

SQL菲德爾

我更喜歡這種方法,因為它可能比您需要的自我連接更好地擴展。 傳入兩個參數:一個用於標簽,一個用於標簽數量。 (我這樣做是希望您的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.

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