特定のレポートエントリ 'warning'を持ち、その警告の説明が記載されているテーブルには表示されないすべてのシステムのID名をリストするSQL文があります。SQLカウントの偏差が2で
SELECT
systems.id,
systems.name
FROM
systems
LEFT JOIN reports ON (reports.system_id = systems.id)
LEFT JOIN explanation_system_standards ON (reports.standard_id = explanation_system_standards.standard_id)
WHERE
reports.status = 'warning' AND reports.datum = (SELECT MAX(datum) FROM reports) AND explanation_system_standards.dismissed_at IS NULL AND NOT EXISTS
(SELECT reports.standard_id
FROM explanation_system_standards
WHERE reports.standard_id = explanation_system_standards.standard_id AND reports.system_id = explanation_system_standards.system_id)
GROUP BY systems.id
このクエリは正確な出力を返します。このケースでは、explain_system_standardsテーブルに表示されないステータスが 'warning'のレポートエントリが6つあります。
psql -d bidlqa_development -f fl.sql | grep testserver.com
396 | testserver.com
396 | testserver.com
396 | testserver.com
396 | testserver.com
396 | testserver.com
396 | testserver.com
ただし、COUNT経由で発生数を追加しようとすると、結果はすべてのシステムで+2になります。 explanation_system_standards.standard_idの、同じ関連付けを使用する表2の他のシステムがあるため、それは2を加算
SELECT
systems.id,
systems.name,
COUNT (systems.id)
FROM
systems
LEFT JOIN reports ON (reports.system_id = systems.id)
LEFT JOIN explanation_system_standards ON (reports.standard_id = explanation_system_standards.standard_id)
WHERE
reports.status = 'warning' AND reports.datum = (SELECT MAX(datum) FROM reports) AND explanation_system_standards.dismissed_at IS NULL AND NOT EXISTS
(SELECT reports.standard_id
FROM explanation_system_standards
WHERE reports.standard_id = explanation_system_standards.standard_id AND reports.system_id = explanation_system_standards.system_id)
GROUP BY systems.id
psql -d bidlqa_development -f fl.sql | grep testserver.com
396 | testserver.com | 8
理由があります。誰も私はこのシステムの基本単位でカウントを与えるためにこのクエリを修正する方法を知っていますか?
EDIT:
私が代わりに私はあなたのカウントにCOUNT(DISTINCT reports.standard_id)
このコードは機能しますか? COUNT –
の前にカンマがありませんが、それは問題ではありません。コピーと貼り付けはここで間違っていました:-) –
あなたの例は不明であり、あなたの質問に混乱を与えます。最初のクエリでは、 'GROUP BY systems.id'(非論理的な' SELECT'の集約関数なし)を行い、その結果は 'GROUP BY'クエリでは不可能な6つの同一行を示しています。次に、2番目の例で 'systems.id' 396は' testserver.com'から 'lqas4409.mod.nl'までの異なる' systems.name'を示しています。これをすべて書き換えて**明快さを加えてください**。 –