2016-03-26 10 views
0

私はほとんどそれを行っていますが、重要なことを変更する必要がありますが、まだ修復する考えはありません。私のSQLの例がありますWHERE IN句で値が存在しないことを確認してください。

SELECT post.id,post.name as post_name, 
(SELECT users.login FROM users WHERE post.creator = users.id) creator, 
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) recommends, 
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) comments, 
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts 
LEFT JOIN tags 
ON post.id = tags.idea_id 
WHERE post.name IN 
(
    SELECT post.name FROM posts 
    JOIN tags ON post.id = post.idea_id 
    WHERE tags.tag IN ('X','Y','Z') 
) 
GROUP BY post.name 

どうしたの?私たちのX、Y、またはZが存在しない場合、クエリはまだ動作しています。私は修理する方法を知らない、私はいくつかのNOT EXISTS句を試してみましたが、それは動作しません。 ありがとうございます。

+0

?あなたの質問は完璧な意味を持ち、タグの1つを持っている投稿を探します。ただし、質問は複雑すぎます。 –

+0

好きな場合は、この簡単な2ステップのアクション・コースを実行することを検討してください。1.まだ実行していない場合は、適切なCREATEおよびINSERTステートメント(および/またはsqlfiddle)を提供して、問題をより簡単に再現できるようにします。 2.まだ実行していない場合は、手順1で提供された情報に対応する結果セットを指定します。 – Strawberry

+0

はい、ただし、( 'X'、 'Y'、 'Z')のタグ投稿タグから存在しない場合は、残りの部分が存在するにもかかわらず、結果はfalseです。 –

答えて

0

私はあなたが行うことができますタグの任意の 1を、持っている記事を探しています:

SELECT post.id, post.name as post_name, 
     (SELECT users.login FROM users WHERE post.creator = users.id) as creator, 
     (SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) as recommends, 
     (SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) as comments, 
     GROUP_CONCAT(tags.tag SEPARATOR ',') as tags 
FROM posts LEFT JOIN 
    tags 
    ON post.id = tags.idea_id 
GROUP BY post.id, post.name 
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) > 0; 

注:私はpost.idを含めるようにGROUP BYを変更(名前は各idのために一意であると仮定)。 GROUP BY句に集計されていない列をすべて含めることをお勧めします。同じ名前に複数のIDがある場合は、SELECTからpost.idを削除します。あなたがタグ何の重複が(合理的な仮定)が存在しないの3つのすべてをしたい場合は

は、その後、HAVINGに変更:

HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3; 
正確に何を探してるんですか
関連する問題