@dinozawrbeatch

Как сделать выборку из нескольких таблиц с помощью оператора LIKE?

Есть код:
SELECT  materials.id, 
        materials.title, 
        materials.author, 
        materials.description, 
        types.name AS type, 
        categories.name AS category 
        FROM materials 
        INNER JOIN tags_to_materials 
        ON materials.id = tags_to_materials.material_id
        INNER JOIN categories 
        ON materials.id_category = categories.id 
        INNER JOIN types 
        ON materials.id_type = types.id 
        INNER JOIN tags 
        ON tags.id = tags_to_materials.tag_id 
        WHERE materials.author LIKE '$str%' 
        OR materials.title LIKE '$str%' 
        OR categories.name LIKE '$str%' 
        OR tags.name LIKE '$str%'

62d06db5f1638370000114.png62d06dc07563e730868299.png62d06dc6a945f728507431.png62d06dcadb500966419969.png
Нужно найти по входящим строкам все совпадения из таблиц (по title, category, tag, author).
Пожалуйста помогите
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Left join - у нас все таки OR.
SELECT materials.id,
       materials.title,
       materials.author,
       materials.description,
       types.name      AS type,
       categories.name AS category
FROM materials
         LEFT JOIN categories
                   ON materials.id_category = categories.id
         LEFT JOIN types
                   ON materials.id_type = types.id
         LEFT JOIN tags_to_materials
                   ON materials.id = tags_to_materials.material_id
         LEFT JOIN tags
                   ON tags.id = tags_to_materials.tag_id
WHERE materials.author LIKE '$str%'
   OR materials.title LIKE '$str%'
   OR categories.name LIKE '$str%'
   OR tags.name LIKE '$str%'


Однако некоторые записи будут возвращаться дважды 0 ибо tags - materials многие ко многим. Если это не устраивает то задача называется groupwise maximum и одно из решений:

select materials.id,
       materials.title,
       materials.author,
       materials.description,
       types.name      AS type,
       categories.name AS category
FROM materials
         LEFT JOIN categories
                   ON materials.id_category = categories.id
         LEFT JOIN types
                   ON materials.id_type = types.id
         LEFT JOIN tags_to_materials
                   ON materials.id = tags_to_materials.material_id
         LEFT JOIN tags
                   ON tags.id = tags_to_materials.tag_id
where materials.id in (
    SELECT materials.id
    FROM materials
             LEFT JOIN categories
                       ON materials.id_category = categories.id
             LEFT JOIN types
                       ON materials.id_type = types.id
             LEFT JOIN tags_to_materials
                       ON materials.id = tags_to_materials.material_id
             LEFT JOIN tags
                       ON tags.id = tags_to_materials.tag_id
    WHERE materials.author LIKE '$str%'
       OR materials.title LIKE '$str%'
       OR categories.name LIKE '$str%'
       OR tags.name LIKE '$str%' group by materials.id);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы