2012-03-11 19 views
1

私は3つのテーブルイメージ、image_tagsとタグを持っています。イメージテーブルにはイメージ情報が含まれ、タグにはタグ情報が含まれ、image_tagsにはイメージとタグの関係が含まれます。 AND条件(INではない)で複数のタグに基づいて画像をフィルタリングしたい複数のANDを同じ結合テーブルcoulmnn

私が試してみました:

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id 
WHERE tag_0.tag = "tagme" 
AND tag_1.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags ON image_tags.tag_id = tags.id 
WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

をしかし、何も、彼らは存在するものの、それは常にゼロ結果を返して働きました。条件がwhere句であるので、それはLEFTが参加していても使用しています

答えて

0

最初のものは正しいものの、正しいものはありません。タグをフィルタリングする方法をフィルタリングするには、image_tagsに2回参加し、tagsの両方のインスタンスを結合して、image_tagsのインスタンスを分離する必要があります。そして、あなたは外側の結合ではなく内側の結合をしたいと思うようです。ここでは:

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it0 ON it0.image_id = i.id 
    INNER JOIN tags t0 ON t0.id = it0.tag_id 
    INNER JOIN image_tags it1 ON it1.image_id = i.id 
    INNER JOIN tags t1 ON t1.id = it1.tag_id 
WHERE i.filesize > 0 
    AND t0.tag = 'tagme' 
    AND t1.tag = 'excellent' 
ORDER BY i.posted DESC 
LIMIT 0, 40 

同じことをする別の方法があります。以下試してください:

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it ON it.image_id = i.id 
    INNER JOIN tags t ON t.id = it.tag_id 
WHERE i.filesize > 0 
    AND t.tag IN ('tagme', 'excellent') 
GROUP BY i.id 
HAVING COUNT(DISTINCT i.tag) = 2 
ORDER BY i.posted DESC 
LIMIT 0, 40 

t.tag IN ('tagme', 'excellent')条件指定されたリストに制限許可されたタグをしてHAVING COUNT(DISTINCT i.tag) = 2画像はそれらのすべてを持っているを確認します。

+0

あなたはロックスターです... – Hirak

1

あなたの最初のクエリは、「優れた」「tagme」の両方でtagsでのヒットが必要です。このように、ON句に条件を移動:

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id AND tag_0.tag = 'tagme' 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id AND tag_1.tag = 'excellent' 
WHERE images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 


あなたの2番目のクエリは道オフになっている - それは不可能条件があります。

WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 

tags.tagすることはできません両方 "tagme" "excellent"です。

+0

すばやく返信いただきありがとうございますが、フィルタなしですべての結果が返されます。何か案が? – Hirak

関連する問題