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

Тема в разделе "Базы данных", создана пользователем zartsergey, 25 мар 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. zartsergey

    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. Т.е. не ИЛИ, а именно И.
    Ломаю голову =(
    Если не понятно объяснил постараюсь переписать вопрос.
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.223
    мало информации... В данном случае достаточно запроса в одну вторую таблицу, т.к. первая содержит только ID, которые полностью повторяются во второй таблице... Нужно больше информации.

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

    zartsergey Постоялец

    Регистр.:
    1 окт 2013
    Сообщения:
    68
    Симпатии:
    6
    Насколько я понимаю,
    Код:
    IN (33, 22, 13);
    отдасть все ID у которых в Opt есть 32, 22, 13. А нужно что бы они были везде.

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

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Код:
    SELECT * FROM `opt` where `opt`.opt IN (33, 22, 13)
    GROUP BY id
    HAVING count(id) = 3; # 3 в зависимости от количества параметров передаваемых в IN
    
    
     
    Последнее редактирование: 25 мар 2014
    zartsergey и Горбушка нравится это.
  5. Sciphoshee

    Sciphoshee Писатель

    Регистр.:
    15 май 2014
    Сообщения:
    2
    Симпатии:
    2
    Направление вроде верное, но считать 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.
     
    Oleg Bakin нравится это.
  6. SteelRat

    SteelRat Постоялец

    Регистр.:
    12 апр 2007
    Сообщения:
    56
    Симпатии:
    9
    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
     
  7. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    147
    Симпатии:
    88
    Лучше так. Гарантированно все 3, в предыдущих вариантах, к примеру, может быть несколько opt=22 дающих верный результат без 33 и 13.

    PHP:
    SELECT `id`
    FROM `opt`
    WHERE `optIN (22,33,13)
    GROUP BY id
    HAVING count
    (distinct `opt`) = 3
     
    latteo нравится это.
  8. SteelRat

    SteelRat Постоялец

    Регистр.:
    12 апр 2007
    Сообщения:
    56
    Симпатии:
    9
    Кстати, запрос можно начать с Select DISTINCT , зависит от второй таблицы
     
  9. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    147
    Симпатии:
    88
    Здесь в любом случае GROUP используется, соответственно DISTINCT нечего будет отсеивать уже. Впустую ресурсы потратите.
     
Статус темы:
Закрыта.