[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySql точное соответствие перечисленному в IN
moskitos80
Всем привет. У меня есть таблица, которая реализует связь "многие ко многим", она имеет всего 2 столбца: programm_id и country_code.

Ситуация такая: есть программа и страны, которые эта программа обслуживает. Мне нужно выбрать из этой таблицы все программы (programm_id ), которые покрывают список стран поступивший на входе от пользователя.

Т.е. меня интересует возможность реализации в блоке WERE условия, которое выдавало бы true при полном совпадении перечисленному значению... по аналогии с IN( "...", "...", "..." ) Почему полное? Потому что, если какая то программа не обслуживает какую то страну, то фактически она не подходит.

IN этого не обеспечиват sad.gif

Ниже представлена таблица в которой представлены 2 программы с programm_id = 2 и 4, и сопоставленные им коды стран.
user posted image



Спустя 29 минут, 14 секунд (14.03.2012 - 11:29) T1grOK написал(а):
Навскидку могу предложить это:

select * from table where programm_id IN(1,2,3) GROUP BY country_code HAVING COUNT(*)=3

Спустя 14 минут, 3 секунды (14.03.2012 - 11:43) moskitos80 написал(а):
Цитата (T1grOK @ 14.03.2012 - 08:29)
Навскидку могу предложить это:

select * from table where programm_id IN(1,2,3) GROUP BY  country_code HAVING COUNT(*)=3

Увы не работает... к тому же как раз programm_id мы и пытаемся получить, а вы указали его в перечислении, я попробовал его заменить на country_code, но получаем не то что нужно.

Спустя 11 минут, 34 секунды (14.03.2012 - 11:55) glock18 написал(а):
Цитата (moskitos80 @ 14.03.2012 - 08:43)
Цитата (T1grOK @ 14.03.2012 - 08:29)
Навскидку могу предложить это:
<pre class="sh_sourceCode" rel="sql">
<span class="sh_keyword">select</span> <span class="sh_symbol">*</span> <span class="sh_keyword">from table where</span> programm_id <span class="sh_keyword">IN</span><span class="sh_symbol">(</span><span class="sh_number">1</span><span class="sh_symbol">,</span><span class="sh_number">2</span><span class="sh_symbol">,</span><span class="sh_number">3</span><span class="sh_symbol">)</span> <span class="sh_keyword">GROUP BY</span>  country_code <span class="sh_keyword">HAVING</span> <span class="sh_function">COUNT(</span><span class="sh_symbol">*)=</span><span class="sh_number">3</span>
</pre>

Увы не работает... к тому же как раз programm_id мы и пытаемся получить, а вы указали его в перечислении, я попробовал его заменить на country_code, но получаем не то что нужно.

плохо подставили значит wink.gif должно работать.

у меня первая мысль была о find_in_set, но, пожалуй, предложенный T1grOK даже лучше

Спустя 54 минуты, 21 секунда (14.03.2012 - 12:49) moskitos80 написал(а):
Цитата (T1grOK @ 14.03.2012 - 08:29)
Навскидку могу предложить это:

select * from table where programm_id IN(1,2,3) GROUP BY  country_code HAVING COUNT(*)=3


SELECT
* FROM `table`
WHERE
`country_code` IN('AU','AT','BA','BB','BD')
GROUP BY `programm_id` HAVING COUNT(*) = 5


Работает! user posted image

- Признаться я сначала подумал - бред какой то: HAVING COUNT(*) = 5, но (спасибо так же glock18) разобравшись в сути ответа - понял, что имел ввиду T1grOK: в условии HAVING мы собираем только те programm_id, кол-во которых = кол-ву запрошенных в IN() кодов, т.е. мы собираем только те программы, которые покрывают запрошенное кол-во стран!

Сам бы ни в жисть не догадался так построить выражение! - Пол дня сидим втроем головы ломаем, а тут T1grOK - "на вскидку предложил"! - Респект и уважуха - надо же как у тебя мозг выворачивается! Чем ты его тренируешь?

Спустя 17 минут, 47 секунд (14.03.2012 - 13:07) walters написал(а):
moskitos80
как бы это не сложная задача ) когда работаешь этим в каждый день то все на много проще выдается.

Спустя 26 минут, 7 секунд (14.03.2012 - 13:33) T1grOK написал(а):
Цитата (moskitos80 @ 14.03.2012 - 09:49)
Чем ты его тренируешь?

Штанга, перекладина, печеньки biggrin.gif

Спустя 7 часов, 59 минут, 42 секунды (14.03.2012 - 21:33) moskitos80 написал(а):
Цитата (T1grOK @ 14.03.2012 - 10:33)
Цитата (moskitos80 @ 14.03.2012 - 09:49)
Чем ты его тренируешь?

Штанга, перекладина, печеньки biggrin.gif

Эх, везёт - у тебя ещё время на штангу и перекладину остаётся. biggrin.gif


_____________
Сложное - просто. Простое сложно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.