Реализация запроса

Тема в разделе "Базы данных", создана пользователем CnecHa3, 26 мар 2011.

Модераторы: latteo
  1. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    Есть ли ф-ция которая противоположна IN() т.е. когда условие не OR, a AND
    value_id IN(1,13) = (value_id = 1 OR value_id = 13)


    SELECT ... LEFT JOIN bp_item_filters f0 ON i.item_id=f0.item_id LEFT JOIN bp_item_filters f1 ON i.item_id=f1.item_id WHERE ... (f0.value_id = 1 AND f1.value_id = 13)
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    а такое вообще возможно?
    вить такого чисто физически невозможно ...
    PHP:
    value_id IN(1,13) = (value_id AND  value_id 13)
    value_id не может одновременно равняться двум разным значениям

    ну а тут
    PHP:
    WHERE ... (f0.value_id AND f1.value_id 13)
    вы используете просто разные значения из разных таблиц f0 и f1

    ---------
    а нафига вообще такое надо?
     
  3. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    из разных таблиц ни как нет, таблица одна
    LEFT JOIN bp_item_filters f0 ON i.item_id=f0.item_id
    LEFT JOIN bp_item_filters f1 ON i.item_id=f1.item_id
    а надо было это чтобы выбрать item_id из bp_item_filters где value_id = 1 И value_id = 13
    т.е. если value_id = 1 И value_id = 14, нужного мне элемента уже не будет
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    а ну да.. таблица одна... недосмотрел
    ну в тогда:
    таблица одна, лефт-джоины идентичны, ( только "псевдонимы" им дали разные: f0 и f1 )
    соответственно результат объединения у них будет одинаковый

    соответственно условие
    не выполнится так как value_id будут одновременно равны на уровне одной строки

    или я дико туплю или же здесь что-то с логикой не то

    предоставьте по возможности структуру всех таблиц участвующих в запросе ... возможно пример "реальных" данных ну и словесное описание того что должно получится после запроса .....
    короче небольшой тестовый дамп - идеальный вариант
     
  5. CnecHa3

    CnecHa3 Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    105
    Симпатии:
    20
    При добавления товара, выбираются определённые фильтра, в каждой категории разные фильтра, потом эти данные записываться в таблицу items, и подумал, чтобы не записывать все фильтра в "кашу" сделал таблицу item_filters куда идет item_id,filter_id,value_id пример:
    items
    -item_id = 1
    item_filters
    -item_id = 1
    -filter_id = 1
    -value_id = 1
    -----------------------
    -item_id = 1
    -filter_id = 13
    -value_id = 2
    -----------------------
    Потом когда уже сортирую товар, я могу выбрать фильтра
    Если его значения 0, то не учитывается, если не 0, то ищем item_id у которого value_id = наш_выбранный_фильтр
    И если выбрано ДВА и БОЛЕЕ фильтров, то их тоже надо учитывать со строгим равенством.

    Вроде бы всё верно, но если не так, то направьте на путь истинный. Раньше не делал "сложные условия" П.С. item_id DISTINCT
     
  6. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    походу так
    PHP:

    SELECT i
    .item_id,  t0.*,count(i.item_id) as 'qwe'
    FROM  items as i
    LEFT JOIN item_filters 
    as t0
        ON t0
    .item_id i.item_id 
      WHERE t0
    .filter_id  in (1,13
    GROUP  BY i.item_id HAVING qwe >= 2

    в блок IN (...) вписываем "фильтры" по которым ищем
    а в qwe >= 2 подставляем условие по количеству совпадений фильтров
     
    CnecHa3 нравится это.