2013-07-04 23 views
1

我的SQL語句有點問題。我有一個帶有product_id和flag_id的表,現在我想獲得與指定的所有標誌匹配的product_id。我知道你必須自己內部加入,以匹配多個,但我不知道它的確切SQL。從MySQL中的多行中選擇一個值

表爲標誌

product_id | flag_id 
    1   1 
    1   51 
    1   23 
    2   1 
    2   51 
    3   1 

我想獲得已FLAG_ID 1,51和23

+1

嗨@Ulrik,一些示例表或查詢將有助於 – kevinm

回答

5

得到這比賽所有標誌指定

的PRODUCT_ID所有產品

此問題被稱爲Relational Division。解決這個問題的一種方法是這樣做:

  • GROUP BY product_id
  • 使用IN謂詞可指定要匹配哪些標誌。
  • 使用HAVING條款以確保標誌的每個產品都有,

這樣的:

SELECT product_id 
FROM flags 
WHERE flag_id IN(1, 51, 23) 
GROUP BY product_id 
HAVING COUNT(DISTINCT flag_id) = 3 

HAVING條款將確保所選擇的product_id必須同時具備三個標誌,如果它有隻有一兩個它會被淘汰。

看到它在這裏的行動:

這會給你只:

| PRODUCT_ID | 
-------------- 
|   1 | 
+0

+1的良好解釋:) –

+0

只是爲了清除一些東西,這會假定'product_id'不是主鍵? – epoch

+0

@epoch - 是的,你是對的。對不起,問題是缺乏關於這個問題的更多細節,但現在他發佈了一些示例數據。 –

0

試試這個:

SELECT * 
FROM your_table 
WHERE flag_id IN(1,2,..); 
+0

感謝您的回答,但我一直在尋找其他的東西:) –

0

首先,它會幫助,如果你可以指定你有嘗試過,但我明白你需要讓產品具有一定的標誌,所以你可以用WHERE

SELECT product_id FROM Product WHERE flag_id IN (1,2,3,4,5) 
+0

感謝您的回答,但我一直在尋找其他東西:) –

0

嘗試:

SELECT * 
FROM TABLE_NAME A INNER JOIN TABLE_NAME B ON A.product_id = B.product_id 
+0

感謝您的回答,但我正在尋找別的東西:) –

相關問題