Mysql Query - Поиск в объединенной таблице без фильтрации записей

0

Я запрашиваю таблицу, в которой каждая строка имеет несколько тегов:

SELECT
    user.*,
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags`
FROM
    user
LEFT JOIN
    user_tag
ON
    user_tag.user_id = user.id
LEFT JOIN
    tag
ON
    tag.id = user_tag.tag_id
GROUP BY
    user.id

Теперь я хочу иметь возможность искать пользователей по тегам. Поэтому, добавив туда, он выглядит следующим образом:

SELECT
    user.*,
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags`
FROM
    user
LEFT JOIN
    user_tag
ON
    user_tag.user_id = user.id
LEFT JOIN
    tag
ON
    tag.id = user_tag.tag_id
WHERE
    tag.tag LIKE "%engineer%" OR
    tag.tag LIKE "%programmer%"
GROUP BY
    user.id

Однако это означает (очевидно), что если результат найден, таблица тегов больше не возвращает все теги пользователей. Таким образом, выбранный столбец tags может выглядеть как "php programmer", даже если у пользователя больше тегов.

Есть ли способ поиска объединенной таблицы без фактического ограничения возвращаемых результатов без использования подзапросов?

  • 0
    Кажется, вам нужны объединенные записи для всех пользователей, для которых существует такой тег, как (например) «% engineer%» или «% programmer%». Но, конечно, предложение EXISTS считается подзапросом, поэтому, возможно, это не то, что вы хотите в ответе. Если бы это было так, я мог бы показать вам, как бы я создал запрос.
Теги:

2 ответа

0
Лучший ответ

Вы можете добавить еще один JOIN с такими тегами:

SELECT
    user.*,
    GROUP_CONCAT(user_tags_to_return.tag SEPARATOR ", ") as `tags`
FROM
    user
LEFT JOIN
    user_tag user_tags_to_filter
ON
    user_tags_to_filter.user_id = user.id
LEFT JOIN
    tag tags_to_filter
ON
    tags_to_filter.id = user_tags_to_filter.tag_id
WHERE
    tags_to_filter.tag LIKE "%engineer%" OR
    tags_to_filter.tag LIKE "%programmer%"
LEFT JOIN user_tag user_tags_to_return
ON user_tags_to_return.user_id = user.id
LEFT JOIN tag tags_to_return
ON tags_to_return.id = user_tags_to_return.tag_id
GROUP BY
    user.id
  • 0
    Глупо с моей стороны. Я уже пытался снова присоединиться к таблице тегов, но мне также следовало бы снова присоединиться к таблице user_tag.
1

Мое предположение заключается в том, что если вы хотите избежать подзапроса, вы можете использовать предложение HAVING с "тегами", например:

SELECT
    user.*,
    GROUP_CONCAT(tag.tag SEPARATOR ", ") as `tags`
FROM
    user
LEFT JOIN
    user_tag
ON
    user_tag.user_id = user.id
LEFT JOIN
    tag
ON
    tag.id = user_tag.tag_id
GROUP BY
    user.id
HAVING
    tags LIKE "%engineer%" OR tags LIKE "%programmer%"
  • 0
    Это хорошая идея. В этом случае это будет хорошо работать, потому что условие использует %LIKE% , поэтому не имеет значения, сравниваем ли мы один тег или объединяем их все.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню