1

どちらも WHERE 句が必要な 2 つの結合を使用してクエリを作成しようとしています。これは機能せず、結合の最後にのみ WHERE を追加できることに気付きました。だから私は代わりにこれを最善の方法で行うことができる方法を知りたい..

これは、最初の結合で WHERE を受け入れない現在のクエリです。

SELECT  
    p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers
FROM 
    posts_tbl AS p
LEFT JOIN 
    post_reply_tbl AS c ON c.post_id = p.id WHERE c.type = 1 AND c.type = 3
LEFT JOIN 
    post_reply_tbl AS a ON a.post_id = p.id WHERE a.type = 2
GROUP BY p.id
4

3 に答える 3

5

ANDそれをnot aに変更しWHEREます:

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers
FROM posts_tbl AS p
LEFT JOIN post_reply_tbl AS c 
    ON c.post_id = p.id 
    AND c.type = 1 AND c.type = 3
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2
GROUP BY p.id

c.type同時に2つの値を持つことはできないため、これを少し変更する必要があると思います:

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers
FROM posts_tbl AS p
LEFT JOIN post_reply_tbl AS c 
    ON c.post_id = p.id 
    AND c.type IN (1, 3)  -- changed to use an OR
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2
GROUP BY p.id

を と の両方にc.type等しくしたい場合は、次の使用を検討してください。13

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, c.answers
FROM posts_tbl AS p
LEFT JOIN
(
    select COUNT(c.id) answers, c.post_id
    from post_reply_tbl c
    where c.type in (1, 3)
    group by c.post_id
    having COUNT(distinct type) = 2
) AS c 
    ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2

1 つの列のみで を使用しているGROUP BYため、MySQL は他の列のどの値が返されるかを決定し、その値は予期しないものになる可能性があります。返される値を確認できる唯一の方法は、各列を集計するか、列ごとにグループ化することです。( GROUP BY に対する MySQL 拡張機能を参照してください)

MySQL ドキュメントから:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。... この機能を使用して、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

このため、サブクエリを使用して取得する方が良いcount()場合があります。そうすれば、残りの列に対して正しい結果が返されることが確実になります。

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, c.answers
FROM posts_tbl AS p
LEFT JOIN
(
    select COUNT(c.id) answers, c.post_id
    from post_reply_tbl c
    where c.type in (1, 3)
) AS c 
    ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a 
    ON a.post_id = p.id 
    AND a.type = 2
于 2013-02-26T16:50:11.293 に答える
0

クエリの最後にすべてのwhere条件を追加することができます。

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers
                FROM posts_tbl AS p
                LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id 
                                LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id 
WHERE a.type = 2
   AND c.type = 1 AND c.type = 3
GROUP BY p.id

または、結合条件でANDを使用します。

SELECT  p.id, p.username, p.date, p.subject, p.year, p.brand, 
    p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT(c.id) AS answers
                FROM posts_tbl AS p
                LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id AND c.type = 1 AND c.type = 3
                                LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id AND a.type = 2
                                GROUP BY p.id
于 2013-02-26T16:51:41.463 に答える
0

すべての用語を 1 つの where 句に入れるだけです

SELECT p.id, p.username, p.date, p.subject, p.year, p.brand, 
p.model, p.type, p.bodywork, p.text, p.image, p.chassis, COUNT AS answers
FROM posts_tbl AS p
LEFT JOIN post_reply_tbl AS c ON c.post_id = p.id 
LEFT JOIN post_reply_tbl AS a ON a.post_id = p.id 
WHERE a.type = 2 AND c.type = 1 AND c.type = 3
GROUP BY p.id
于 2013-02-27T08:05:14.690 に答える