invitees
とinvitee_information
の2つのテーブルがあります。招待者はevents
に属しています(3番目のテーブルevent_idはinvitees
テーブルの外部キーです)。
情報がまだない(invitee_information
テーブルにレコードがない)イベントごとの招待者の総数を取得します。
Where句と反結合パターンでevent_id
を1つだけ使用してクエリを作成すると(情報が保存されていない行をフィルターするためにinvitee_id
列のIS NULL)、指定されたとおりにカウントが返されますevent_id:
SELECT COUNT(i.id)
FROM invitees i
LEFT JOIN invitee_information ii
ON ii.invitee_id = i.id
WHERE ii.invitee_id IS NULL AND i.`event_id` = 18571 AND i.`invitation_sent` = 1;
クエリを最適化して、このeventデータをループで取得する代わりに、複数のevent_idのDBレベルでこのカウントデータを取得するために、INを使用して複数のevent_idを渡し、GROUP_BY event_id
を使用しました。
期待される結果は次のとおりです(event_id 18569のinvitee_information
テーブルにデータが保存されていない場合:
event_id | count(i.id)
18569 | 0
ただし、クエリ結果は常に空です。私の更新されたクエリは:
SELECT i.`event_id`, COUNT(i.id)
FROM invitees i
LEFT JOIN invitee_information ii
ON i.id = ii.invitee_id
WHERE ii.invitee_id IS NULL AND i.`event_id` IN(18569,18571) AND i.`invitation_sent` = 1
GROUP BY i.`event_id`;
あなたの質問についてはわかりませんが、このような結果の後ですか?
_| event_id | c |
|----------|---|
| 18569 | 3 |
| 18571 | 2 |
| 20000 | 0 |
_
はいの場合、SUM(IF(ii.invitee_id IS NULL, 1,0))
を使用する必要があります
_SELECT i.`event_id`, SUM(IF(ii.invitee_id IS NULL, 1,0)) c
FROM invitees i
LEFT JOIN invitee_information ii
ON i.id = ii.invitee_id
WHERE
i.`event_id` IN(18569,18571,20000)
AND i.`invitation_sent` = 1
GROUP BY i.`event_id`
_
完全な答え:
MySQL 5.6スキーマ設定:
_CREATE TABLE invitees
(`id` int, `event_id` int, `invitation_sent` int)
;
INSERT INTO invitees
(`id`, `event_id`, `invitation_sent`)
VALUES
(1, 18569, 1),
(2, 18569, 1),
(3, 18569, 1),
(4, 18569, 1),
(5, 18571, 1),
(6, 18571, 1),
(7, 10000, 0),
(8, 10000, 0),
(9, 20000, 1)
;
CREATE TABLE events
(`id` int)
;
INSERT INTO events
(`id`)
VALUES
(18569),
(18571),
(10000),
(20000)
;
CREATE TABLE invitee_information
(`invitee_id` int)
;
INSERT INTO invitee_information
(`invitee_id`)
VALUES
(9),
(4)
;
_
クエリ1:
_-- Your one by one query
SELECT i.`event_id`, COUNT(i.id) c
FROM invitees i
LEFT JOIN invitee_information ii
ON ii.invitee_id = i.id
WHERE ii.invitee_id IS NULL AND i.`event_id` = 18571 AND i.`invitation_sent` = 1
_
結果:
_| event_id | c |
|----------|---|
| 18571 | 2 |
_
クエリ2:
_-- The IN only for count at least 1
SELECT i.`event_id`, COUNT(i.id) c
FROM invitees i
LEFT JOIN invitee_information ii
ON i.id = ii.invitee_id
WHERE
ii.invitee_id IS NULL
AND
i.`event_id` IN(18569,18571,20000)
AND i.`invitation_sent` = 1
GROUP BY i.`event_id`
_
結果:
_| event_id | c |
|----------|---|
| 18569 | 3 |
| 18571 | 2 |
_
クエリ3:
_-- The count for every event asked
SELECT i.`event_id`, SUM(IF(ii.invitee_id IS NULL, 1,0)) c
FROM invitees i
LEFT JOIN invitee_information ii
ON i.id = ii.invitee_id
WHERE
i.`event_id` IN(18569,18571,20000)
AND i.`invitation_sent` = 1
GROUP BY i.`event_id`
_
結果:
_| event_id | c |
|----------|---|
| 18569 | 3 |
| 18571 | 2 |
| 20000 | 0 |
_
クエリ4:
_-- If you want the count for every event whatever invitation_sent
SELECT i.`event_id`, SUM(IF(ii.invitee_id IS NULL, 1,0)) c
FROM invitees i
LEFT JOIN invitee_information ii
ON i.id = ii.invitee_id
GROUP BY i.`event_id`
_
結果:
_| event_id | c |
|----------|---|
| 10000 | 2 |
| 18569 | 3 |
| 18571 | 2 |
| 20000 | 0 |
_