1

MySQL SELECTを含むクエリから奇妙な結果が得られます。私の理解が間違っているのか、それとも本当に奇妙な動作が見られているのかLEFT JOINわかりません。LEFT JOIN

多対 1 の関係を持つ 2 つのテーブルがtable 1ありますtable 2。テーブル 1 のすべてのレコードを、テーブル 2 の関連レコードの数をカウントする列で選択したいと考えています。私が理解しているように、常にステートメントLEFT JOINの側にあるすべてのレコードを返す必要があります。LEFT

問題を示すテストデータベースは次のとおりです。

CREATE DATABASE Test;
USE Test;

CREATE TABLE Dates (
   dateID INT UNSIGNED NOT NULL AUTO_INCREMENT,
   date DATE NOT NULL,
   UNIQUE KEY (dateID)
) TYPE=MyISAM;


CREATE TABLE Slots (
   slotID INT UNSIGNED NOT NULL AUTO_INCREMENT,
   dateID INT UNSIGNED NOT NULL,
   UNIQUE KEY (slotID)
) TYPE=MyISAM;

INSERT INTO Dates (date) VALUES ('2008-10-12'),('2008-10-13'),('2008-10-14');
INSERT INTO Slots (dateID) VALUES (3);

Dates テーブルには 3 つのレコードと Slots 1 があり、そのレコードは Dates の 3 番目のレコードを指しています。

次のクエリを実行すると..

SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;

.. 3 行のテーブルが表示されることを期待しています。2 行はカウント 0 で、1 行はカウント 1 です。しかし、実際に表示されるのは次のとおりです。

+------------+-----------------+
| date       | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 |               0 |
| 2008-10-14 |               1 |
+------------+-----------------+

ゼロ カウントの最初のレコードが表示されますが、ゼロ カウントの後のレコードは無視されます。

私は何か間違ったことをしていますか、それとも LEFT JOIN が何をすべきか理解していませんか?

4

6 に答える 6

6

する必要がありGROUP BY d.dateIDます。あなたのケースのうちの 2 つs.DateIDNULL( LEFT JOIN) であり、これらは結合されています。

GROUP BYd.date は集計操作の一部でも結果でもないため、これは無効な (ANSI) SQL であることがわかると思いますSELECT

于 2008-10-15T16:17:16.527 に答える
2

d.dateId でグループ化するつもりだと思います。

于 2008-10-15T16:15:58.137 に答える
1

GROUP BY s.dateID を削除してみてください

于 2008-10-15T16:16:59.337 に答える
1

10-12 と 10-13 の dateid は、あなたによってグループ化されています。それらは 2 つの null 値であるため、カウントは 0 に評価されます

于 2008-10-15T16:20:46.940 に答える
1

これが MySQL で有効かどうかはわかりませんが、代わりに次の構文を使用することで、将来この間違いを回避できる可能性があります。

SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)

USING 句を使用すると、2 つの dateID を追跡する必要がなくなります。

于 2008-10-15T17:10:15.470 に答える
0

GROUP BY s.dateID を d.dateID に置き換えます。

于 2008-10-15T16:22:34.410 に答える