0

現在、左結合で2つのテーブルを結合しようとしています:

- ポータル -

  • id_portal (インデックス)
  • id_venue
  • name_portal

- アクセス -

  • id_access (インデックス)
  • id_event
  • id_ポータル
  • id_チケット
  • scan_access

「アクセス」には、各イベントのポータルごとに多数のチケット タイプが含まれています。これらを組み合わせて、各ポータルの scan_access 列の合計を取得する必要がありますが、scan_access が「null」のポータルを含めて「0」にする必要があります。これを達成するために、左結合を使用しました。

SELECT portal.name_portal, SUM(access.scan_access) AS total_scan 
FROM portal LEFT JOIN access ON portal.id_portal = access.id_portal 
WHERE portal.id_venue = $venueId 
GROUP BY portal.id_portal 
ORDER BY portal.id_portal ASC

つまり、次のようになります。

  • ポータル 1 - ヌル
  • ポータル 2 - 40
  • ポータル 3 - 33
  • ポータル 4 - ヌル

しかし、イベント (id_event) を考慮して上記の結果も取得する必要がある場合に問題があります。

SELECT portal.name_portal, SUM(access.scan_access) AS total_scan 
FROM portal LEFT JOIN access ON portal.id_portal = access.id_portal 
WHERE portal.id_venue = $venueId AND access.id_event = 20 
GROUP BY portal.id_portal 
ORDER BY portal.id_portal ASC

私は得る:

  • ポータル 2 - 40
  • ポータル 3 - 33

id_event 値を持つ行は 2 つだけなので、これは理にかなっています。しかし、他のポータルを失わずにこの列を考慮するにはどうすればよいでしょうか? また、結果を返すときに「null」をゼロにする方法はありますか?(phpでnullを修正できますが、可能かどうかを確認したかったのです)

4

2 に答える 2

1

NULLを0に変換するには、これを使用します

 COALESCE(col, 0)

あなたの例では、

     SUM(COALESCE(access.scan_access, 0)) AS total_scan
于 2013-02-02T23:59:29.840 に答える
1

access.id_event = 20あなたのWHERE句を入れることで、あなたはあなたをにLEFT JOIN変えますINNER JOINaccess.id_event = 20結合基準に移動して、 LEFT JOIN. @echo_me が述べたようCOALESCE()に、ゼロを取り除くために使用できます。SUM()の代わりに , の周りに配置します。

SELECT portal.name_portal, COALESCE( SUM(access.scan_access), 0 ) AS total_scan 
FROM portal LEFT JOIN access ON portal.id_portal = access.id_portal AND access.id_event = 20 
WHERE portal.id_venue = $venueId
GROUP BY portal.id_portal 
ORDER BY portal.id_portal ASC
于 2013-02-03T00:04:17.993 に答える