Я запрашиваю таблицу, в которой каждая строка имеет несколько тегов:
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", даже если у пользователя больше тегов.
Есть ли способ поиска объединенной таблицы без фактического ограничения возвращаемых результатов без использования подзапросов?
Вы можете добавить еще один 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
Мое предположение заключается в том, что если вы хотите избежать подзапроса, вы можете использовать предложение 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%"
%LIKE%
, поэтому не имеет значения, сравниваем ли мы один тег или объединяем их все.