【发布时间】:2021-03-31 15:29:08
【问题描述】:
我有两个关系表,我想使用 IF 条件过滤数据。问题是使用 LEFT JOIN 我得到了无法分组的记录。
我拥有的表格是:
日历
预订者
第一个表格包含可供更多人预订的课程,第二个表格包含预订每节课程的数据。我想实现的 IF 条件是:如果课程被特定用户预订,则返回“2”,如果课程被预订,则返回“1”,但被其他用户预订,如果课程未被预订,则返回“0”。
我想根据上表得到的结果如下图所示。
但是,当我使用 LEFT JOIN 链接这些表时,我得到了每个预订特定课程的用户的记录。
SELECT calendar.id, calendarId, lessonType, description,
CASE
WHEN bookedBy then IF(bookedBy = 8, '2', '1')
ELSE '0'
END AS bb,
(select count(bookedBy) from bookers where calendar.id = bookers.lessonId) as nOfBookers
FROM calendar
LEFT JOIN bookers ON calendar.id = bookers.lessonId
WHERE `calendarId`= 180
如果没有 LEFT JOIN (fiddle),计数会正确显示,但我不能包含 IF 条件,因为未定义表预订者。
如果有任何帮助,我将不胜感激。非常感谢您。
这里是Fiddle。
CREATE TABLE `calendar` (
`id` int(11) NOT NULL,
`calendarId` varchar(50) NOT NULL,
`lessonType` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `calendar`
(`id`, `calendarId`, `lessonType`, `description`)
VALUES
(1, '180', 'A', ''),
(2, '180', 'A', ''),
(3, '180', 'A', ''),
(4, '180', 'B', ''),
(5, '180', 'B', ''),
(6, '180', 'B', ''),
(7, '180', 'B', ''),
(8, '180', 'B', ''),
(9, '180', 'B', '');
CREATE TABLE `bookers` (
`id` int(11) NOT NULL,
`lessonId` int(11) DEFAULT NULL,
`bookedBy` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- Dumping data for table `bookers`
--
INSERT INTO `bookers` (`id`, `lessonId`, `bookedBy`) VALUES
(4, 1, 8),
(5, 2, 8),
(6, 2, 28),
(7, 2, 17),
(8, 3, 11);
--
-- Indexes for dumped tables
--
ALTER TABLE `calendar`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `id` (`id`);
--
-- Indexes for table `bookers`
--
ALTER TABLE `bookers`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `bookers`
--
ALTER TABLE `bookers`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
COMMIT;
select version();
【问题讨论】:
-
lessonId=2共有 3 个不同的预订者,但您的预期结果显示输出为bb=2.. 因此,当特定用户出现在lessonId中时,其他用户将被忽略? -
是的,完全正确。
bb只是一个参数来描述特定用户是否存在(bb=2),特定用户是否不存在,但其他一些(bb=1),如果没有人存在(@ 987654339@).