2011-01-20 5 views
0

я запрашиваю таблицу, где каждая строка имеет несколько меток:Mysql Query - Поиск в объединенной таблице без фильтрации записей

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

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

ответ

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. – sander

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%', поэтому не имеет значения, сравниваем ли мы с одним тегом или с конкатенацией всех из них. –

Смежные вопросы