2011-01-20 5 views
0

私は、各行が複数のタグを持つテーブルをクエリ:MySQLのクエリ - フィルタリングレコードせずに結合されたテーブルでの検索

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%」のようなタグが存在するすべてのユーザーの結合レコードが必要なようです。もちろん、EXI​​STS句はサブクエリとみなされるので、おそらくそれはあなたが答えで欲しいものではありません。そうだった場合は、どのようにクエリを作成するかを示すことができます。 – hardmath

答えて

0

は、このようなタグを登録しよう:ここ

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%'を使用するので、このケースではうまくいくでしょう。したがって、1つのタグまたはそれらのすべての連結と比較するかどうかは関係ありません。 –

関連する問題