web-dev-qa-db-ja.com

左結合とINでgroup byを使用すると、空の結果が生成されます

inviteesinvitee_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`;
3
Ali Malik

あなたの質問についてはわかりませんが、このような結果の後ですか?

_| 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`
_

完全な答え:

SQLフィドル

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 |
_
1
Blag