Mysql 计算每次旅行的预订数量-如果没有,则返回0

Mysql 计算每次旅行的预订数量-如果没有,则返回0,mysql,sql,Mysql,Sql,我有两张桌子 CREATE TABLE `voyages` ( `voyage_id` int(11) NOT NULL, `voyage_type` int(11) NOT NULL, `voyage_groupBooking` tinyint(4) NOT NULL DEFAULT 0, `voyage_live` tinyint(4) NOT NULL DEFAULT 0, `voyage_featured` tinyint(4) NOT NULL DEFAULT 0, `voyage_n

我有两张桌子

CREATE TABLE `voyages` (
`voyage_id` int(11) NOT NULL,
`voyage_type` int(11) NOT NULL,
`voyage_groupBooking` tinyint(4) NOT NULL DEFAULT 0,
`voyage_live` tinyint(4) NOT NULL DEFAULT 0,
`voyage_featured` tinyint(4) NOT NULL DEFAULT 0,
`voyage_name` varchar(60) NOT NULL,
`voyage_slug` varchar(60) NOT NULL,
`voyage_shortDescription` varchar(150) NOT NULL,
`voyage_shortPageDescription` text NOT NULL,
`voyage_tag` varchar(20) DEFAULT NULL,
`voyage_detail` text NOT NULL,
`voyage_ageBracket` text NOT NULL DEFAULT '14-18',
`voyage_included` varchar(150) NOT NULL,
`voyage_image` text DEFAULT NULL,
`voyage_startDate` date NOT NULL,
`voyage_startTime` time NOT NULL,
`voyage_endDate` date NOT NULL,
`voyage_cost` decimal(11,2) NOT NULL,
`voyage_miles` int(11) DEFAULT NULL,
`voyage_hours` int(11) DEFAULT NULL,
`voyage_ports` int(11) DEFAULT NULL,
`voyage_deposit` int(2) NOT NULL DEFAULT 0,
`voyage_crewBerth` tinyint(2) NOT NULL,
`voyage_Afterguard` tinyint(2) NOT NULL,
`voyage_map` text DEFAULT NULL,
`voyage_mapZoom` tinyint(4) NOT NULL DEFAULT 8,
`voyage_addressName` varchar(150) NOT NULL,
`voyage_streetAddress` varchar(150) NOT NULL,
`voyage_locality` varchar(150) NOT NULL,
`voyage_postalCode` varchar(150) NOT NULL,
`voyage_region` varchar(150) NOT NULL,
`voyage_country` varchar(150) NOT NULL,
`voyage_gallery` text DEFAULT NULL,
`voyage_deleted` tinyint(4) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我试图根据每次航行计算有多少预订,如果没有,则返回0

e、 g:

等等

目前我有以下几点,但似乎不起作用。我目前在预订表中只有一行测试数据,在航行表中只有17次航行

SELECT voyage_name, voyage_id, bookings.booking_voyageID, 
COUNT(bookings.booking_voyageID) AS bookingcount
FROM voyages
LEFT JOIN bookings ON voyages.voyage_id = bookings.booking_voyageID
ORDER BY voyage_name asc

如果没有预订,我需要我的SQL查询返回0的计数。

我认为计数不足以解决您的问题,因为如果有一行用于航行,它将返回1,而不会返回0

SUM
是您对自定义列的要求

试试这个

SELECT 
  voyage_id, 
  bookings.booking_voyageID,
  SUM(CASE WHEN bookings.booking_voyageID IS NULL THEN 0 ELSE 1 END) as 
bookingcount
FROM 
  voyages
LEFT JOIN 
  bookings 
ON 
  voyages.voyage_id = bookings.booking_voyageID
GROUP BY
  voyage_id
ORDER BY
  voyage_id;

您的WHERE子句过多-将其删除。ON子句条件就足够了。这将按航次名称返回航次计数。遗憾的是,我需要它来计算每次航次的预订数量。谢谢你的帮助!提供:完整的表格创建表格脚本;插入带有一些示例数据的脚本;此数据的所需输出。
SELECT voyage_name, voyage_id, bookings.booking_voyageID, 
COUNT(bookings.booking_voyageID) AS bookingcount
FROM voyages
LEFT JOIN bookings ON voyages.voyage_id = bookings.booking_voyageID
ORDER BY voyage_name asc
SELECT 
  voyage_id, 
  bookings.booking_voyageID,
  SUM(CASE WHEN bookings.booking_voyageID IS NULL THEN 0 ELSE 1 END) as 
bookingcount
FROM 
  voyages
LEFT JOIN 
  bookings 
ON 
  voyages.voyage_id = bookings.booking_voyageID
GROUP BY
  voyage_id
ORDER BY
  voyage_id;