За последние 24 часа нас посетили 18066 программистов и 1651 робот. Сейчас ищут 1757 программистов ...

создание запроса

Тема в разделе "MySQL", создана пользователем masterlelik, 6 фев 2017.

  1. masterlelik

    masterlelik Активный пользователь

    С нами с:
    8 ноя 2008
    Сообщения:
    68
    Симпатии:
    0
    Есть две таблицы
    1) Таблица хранит programm_id программы и filter_value значение фильтра
    programm_id | filter_value
    1 | 8
    1 | 9
    1 | 11
    2 | 9
    2 | 11
    2 | 12
    2) Таблица хранит фильтры filter_id и их значения filter_value
    filter_id | filter_value
    filter_id=1 - пол
    filter_id=2 - возраст
    filter_value=8 - мальчик
    filter_value=9 - девочка
    filter_value=11 - 5-10 лет
    filter_value=12 - 11-15 лет
    1 | 8
    1 | 9
    2 | 11
    2 | 12

    Как выбрать все программы, если на сайте выбраны фильтры со значениями filter_value
    8, 9, 11, 12 должно выбрать обе программы 1 и 2
    или
    8, 11, 12 должно выбрать программы 1

    Т.е. суть такая, что есть родительский filter_id и если выбрано хотя бы одно его значение, то это 1

    Я пробовал так, но лли COUNT не по тому полю, или группировать по другому полю
    SELECT `t1`.`programm_id`, count(`t2`.`filter_id`) AS cnt FROM `t_programm_filter` `t1`, `t_filters` `t2`
    WHERE `t1`.`filter_value`=`t2`.`filter_value` AND t1.filter_value IN (8,9,11,12) GROUP BY `t2`.`filter_id` HAVING cnt>=2

    P.S. cnt тут 2 и более, потому что в примере выбирается хотя бы одно значение каждого из двух фильтров
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @masterlelik ну сразу идёт запрос в первую таблицу и полученные результаты формируют строку второго запроса
     
  3. masterlelik

    masterlelik Активный пользователь

    С нами с:
    8 ноя 2008
    Сообщения:
    68
    Симпатии:
    0
    @abrdabr
    можно на примере?
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @masterlelik не мне лень.... но делаем запрос к первой таблице типа селект * где столбец=11
    далее средствами пыха (или вложенный запрос?) преобразовываем результат в вид $res='value1 or value2 or ...'
    и делаем запрос вида select * from table where filtervalue=$res
     
  5. masterlelik

    masterlelik Активный пользователь

    С нами с:
    8 ноя 2008
    Сообщения:
    68
    Симпатии:
    0
    @abrdabr
    по идее это должно решаться одним запросом
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @masterlelik тапа select * from table2 where chtoto= select from table1 where yslovie?
     
  7. masterlelik

    masterlelik Активный пользователь

    С нами с:
    8 ноя 2008
    Сообщения:
    68
    Симпатии:
    0
    @abrdabr
    вот это я и хотел бы узнать
     
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @masterlelik тогда это не ко мне и в раздел сделайте за меня
     
  9. AlexsaiL

    AlexsaiL Активный пользователь

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
  10. Drema

    Drema Новичок

    С нами с:
    20 фев 2017
    Сообщения:
    117
    Симпатии:
    30
    Если следовать строго рамкам задачи:

    Код (Text):
    1. SELECT *
    2. FROM table1
    3. WHERE filter_value IN(
    4.     SELECT filter_value
    5.     FROM table2
    6.     WHERE filter_id IN (1)
    7.      AND filter_value IN (8, 9, 11, 12)
    8. )
    , где условие filter_id IN (1) нужно для определения группы "важных" полей.