【问题标题】:How to implement IF condition in two relational tables?如何在两个关系表中实现 IF 条件?
【发布时间】: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@).

标签: mysql select


【解决方案1】:

试试这个:

SELECT id, calendarid, lessontype, description,
       CASE WHEN FIND_IN_SET(8,vbb)>0 THEN 2 
            WHEN vbb IS NOT NULL THEN 1
            ELSE 0 END AS bb,
        nOfBookers
FROM
(SELECT c.id, calendarId, lessonType, GROUP_CONCAT(bookedby) AS vbb, description, 
(SELECT COUNT(bookedby) FROM bookers WHERE c.id = bookers.lessonId) AS nOfBookers
FROM calendar c
LEFT JOIN bookers b ON c.id = b.lessonId
WHERE `calendarId`= 180
GROUP BY c.id, calendarId, lessonType, description) A;

除了您最初的LEFT JOIN 尝试之外,我还添加了GROUP_CONCAT(bookedby) AS vbb,它将返回一个逗号分隔的bookedby 值;这是17,28,8。之后,我将查询作为子查询,并在vbb 上使用FIND_IN_SET 函数执行CASE 表达式以查找特定的bookedby

这是一个更新小提琴:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0933e9fc3cb7445311c34c6705d11637

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多