バックグラウンド
MySQL には、さまざまな種類のフィードバック項目を含む 2 つのテーブルがあります。これらのテーブルを組み合わせてFULL OUTER JOIN
(実際には、MySQL では 2 つの結合とユニオンとして記述されています)、平均成績を数えるクエリを作成しました。このクエリは完全に機能するようです:
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
LEFT JOIN feedback_service AS s USING(name)
GROUP BY name)
UNION ALL
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
RIGHT JOIN feedback_service AS s USING(name)
WHERE l.id IS NULL
GROUP BY name)
ORDER BY name;
(これは読みやすくするためにいくらか単純化されていますが、ここでは違いはありません)
問題
次に、日付によるフィルタリングを追加してみました (つまり、特定の日付以降に作成されたフィードバック項目のみが考慮されます)。私のSQLスキルと私が行った調査により、私はこれを思いつくことができました:
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
LEFT JOIN feedback_service AS s USING(name)
WHERE (s.createdTime >= '" & date & "' OR s.createdTime IS NULL)
AND (l.createdTime >= '" & date & "' OR l.createdTime IS NULL)
GROUP BY name)
UNION ALL
(SELECT name, AVG(l.overallQuality) AS avgLingQual,
AVG(s.overallSatisfaction) AS avgSvcQual
FROM feedback_linguistic AS l
RIGHT JOIN feedback_service AS s USING(name)
WHERE l.id IS NULL
AND (s.createdTime >= '" & date & "' OR s.createdTime IS NULL)
GROUP BY name)
ORDER BY name;
これはほとんど機能します。得られる結果はほぼ正しいように見えます。ただし、いくつかのフィードバック項目がありません。たとえば、1 か月前の日付を設定すると、データベース内の 21 人の異なる人のフィードバックを数えましたが、このクエリでは 19 人しか返されません。最悪のことは、欠落しているアイテムの間に類似点が見つからないように見えることです.
このクエリで何か間違っていますか? WHERE
この句は、の後に日付のフィルタリングを行うと思いますJOIN
。理想的には、おそらく前に行うことになるでしょう。繰り返しますが、これが私の問題の原因であるかどうかはわかりません。また、このクエリを別の方法で記述する方法もわかりません。