Вытащить из первой таблицы данные, только для тех ID, которые имеют нужные числа во 2й таблице

Статус
В этой теме нельзя размещать новые ответы.

zartsergey

Постоялец
Регистрация
1 Окт 2013
Сообщения
68
Реакции
6
Доброго времени суток.
Есть два таблицы:
Первая - лежат данные об неких объектах.
Вторая - лежат данные, которые связаны с этими объектами.
Первая
----ID---
| 1 |
| 2 |
| 3 |
| 4 |
| 6 |
| 7 |
__________

Вторая
--ID--Opt--
| 1 | 33 |
| 1 | 22 |
| 1 | 13 |
| 2 | 34 |
| 2 | 76 |
| 3 | 1 |
| 1 | 33 |
| 1 | 12 |
| 1 | 13 |
| 2 | 14 |
| 2 | 15 |
| 7 | 16 |
__________


Собственно какой нужен запрос:
Вытащить нужную инфу из первой таблицы, только от тех ID, которые железно должны иметь нужные числа в Opt из второй таблицы.
Допустим вытащить все ID которые имеют в Opt числа 33 И 22 И 13. Т.е. не ИЛИ, а именно И.
Ломаю голову =(
Если не понятно объяснил постараюсь переписать вопрос.
 
мало информации... В данном случае достаточно запроса в одну вторую таблицу, т.к. первая содержит только ID, которые полностью повторяются во второй таблице... Нужно больше информации.

А так, телаем запрос во вторую таблицу, цепляем заголовки из первой:
Код:
SELECT `opt`.*, `id`.`title` FROM `opt` INNER JOIN `id` on `opt`.id` = `id`.`id` WHERE `opt`.`id` IN (33, 22, 13);
Писал с ходу, мог напортачить.
 
Насколько я понимаю,
Код:
IN (33, 22, 13);
отдасть все ID у которых в Opt есть 32, 22, 13. А нужно что бы они были везде.

Ладно, забьем на первую таблицу.
Как из 2й забрать только те ID у которых в Opt есть 32 И 22 И 13
 
Как из 2й забрать только те ID у которых в Opt есть 32 И 22 И 13

Код:
SELECT * FROM `opt` where `opt`.opt IN (33, 22, 13)
GROUP BY id
HAVING count(id) = 3; # 3 в зависимости от количества параметров передаваемых в IN
 
Последнее редактирование:
Направление вроде верное, но считать count(id) в HAVING дает какой то не тот результат, на тестовой базе возвращается пустой результат по вышеописанному запросу.
Может лучше как то так:

Код:
SELECT id, count(*) AS num
FROM `opt`
WHERE opt IN (22,33,13)
GROUP BY id
HAVING num >= 3 # как и в примере выше зависит от кол-ва параметров в IN

Больше или равно в HAVING потому что не известно уникально ли сочетание ключ->значение в таблице, ведь если нет - может быть число и намного больше чем число параметров в IN.
 
Select t1.id from t1
left join (
SELECT id, count(*) AS num
FROM `opt`
WHERE opt IN (22,33,13)
GROUP BY id
) as ttbl on (ttbl.id=t1.id and ttbl.num>=3)
where ttbl.id IS not null
 
Лучше так. Гарантированно все 3, в предыдущих вариантах, к примеру, может быть несколько opt=22 дающих верный результат без 33 и 13.

PHP:
SELECT `id`
FROM `opt`
WHERE `opt` IN (22,33,13)
GROUP BY id
HAVING count(distinct `opt`) = 3
 
Кстати, запрос можно начать с Select DISTINCT , зависит от второй таблицы
 
Кстати, запрос можно начать с Select DISTINCT , зависит от второй таблицы
Здесь в любом случае GROUP используется, соответственно DISTINCT нечего будет отсеивать уже. Впустую ресурсы потратите.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху