За последние 24 часа нас посетили 18715 программистов и 1603 робота. Сейчас ищут 894 программиста ...

Выборка по параметрам таблиц

Тема в разделе "MySQL", создана пользователем IceCream, 7 ноя 2012.

  1. IceCream

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

    С нами с:
    1 июл 2011
    Сообщения:
    27
    Симпатии:
    0
    Собственно есть 3 таблицы.
    products со списком товаров
    tags со списком тегов
    products_to_tags со списком соответствия id тегов id товаров

    Надо поискать в паре полей таблицы и в поле таблицы tags значение. После вывести все товары где оно присутствует.

    самый очевидный вариант
    Код (Text):
    1. select distinct p.products_id, p.products_name, p.products_image, p.products_price
    2. from products p
    3. left join products_to_tags ptt on p.products_id = ptt.products_id
    4. left join tags t on ptt.tag_id = t.id
    5. where p.products_status = '1'
    6. and (p.products_name like '%искомое_значение%' or p.products_description like '%искомое_значение%' or p.products_model like '%искомое_значение%' or t.name like '%искомое_значение%')
    вариант работает. Но работает медленно и грузит сервер.

    второй вариант
    Код (Text):
    1.  
    2. select distinct p.products_id, p.products_name, p.products_image, p.products_price
    3. from products_to_tags ptt, tags t, products p
    4. where p.products_status = '1'
    5. AND p.products_id = ptt.products_id and ptt.tag_id = t.id
    6. and (p.products_name like '%искомое_значение%' or p.products_description like '%искомое_значение%' or p.products_model like '%искомое_значение%' or t.name like '%искомое_значение%')
    работает быстро но, выдаёт только найденное в t.name, что в прочем не удивительно ибо AND p.products_id = ptt.products_id and ptt.tag_id = t.id в данном варианте требуют именно этого.

    Собственно как сделать быстрее и правильно?

    Добавлено спустя 20 минут 47 секунд:
    Зы: Знаю что вообще этот принцип не есть верный и текст надо индексировать а после уже по индексам выбирать из базы. Но времени делать "как надо" увы нет, приходится искать самое оптимальное из не оптимального... :(
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    давайте определимся с тормозиловом. Если делать один запрос с %% по имени, а второй отдельно по тегам, то по сколько времени они отдельно исполняться будут?
     
  3. IceCream

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

    С нами с:
    1 июл 2011
    Сообщения:
    27
    Симпатии:
    0
    Вариант выбрать два массива а потом уже их объединить удаляя дубликаты я уже рассматривал. Да так быстрее. Вот пример:
    4.3458 сек. - одним запросом

    0.0144 сек. - отдельно по тегам
    0.0535 сек. - отдельно по имени, описанию и модели

    Этот вариант и буду юзать если варианта быстрее выбрать всё и сразу не найду. Собственно напрягает он только из-за большого количества мест куда придётся впихнуть разные костыли.