0

我目前正在尝试使用左连接加入两个表:

- 门户网站 -

  • id_portal(索引)
  • id_venue
  • name_portal

- 使用权 -

  • id_access(索引)
  • id_event
  • id_portal
  • id_tickets
  • 扫描访问

'access' 包含每个活动的每个门户的多种票证类型。我需要将这些组合起来以获得每个门户的 scan_access 列的总和,但包括具有“null”scan_access 的门户以得出“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 值。但是我怎样才能在不丢失其他门户的情况下考虑这个 col 呢?另外,sql中是否有办法在返回结果时使“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 JOIN. 进入access.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 回答