2013-07-04 4 views
1

У меня есть небольшая проблема с моим предложением SQL. У меня есть таблица с product_id и флаг_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' является _not_ основным ключом? – 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

Try:

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

Спасибо за ваш ответ, но Я искал что-то еще :) –

Смежные вопросы