MySQL:更改每个选定行的用户变量

标签 mysql sql user-variables

我正在尝试在 MySQL 数据库中选择约会之间的前 10 个空时段。

约会表基本上有 3 个字段:appointment_id INT、startDateTime DATETIME 和 endDateTime DATETIME。

我们可以想象这样的一些数据(为了简单起见,我将日期部分保留在日期时间之外,所以让我们考虑这些时间是在同一天)。数据也按 startDateTime 排序:

4 | 09:15:00 | 09:30:00
5 | 09:30:00 | 09:45:00
8 | 10:00:00 | 10:15:00
3 | 10:30:00 | 10:45:00
7 | 10:45:00 | 11:00:00
2 | 11:00:00 | 11:15:00
1 | 11:30:00 | 12:00:00

所以我的目标是提取:

00:00:00 | 09:15:00
09:45:00 | 10:00:00
10:15:00 | 10:30:00
11:15:00 | 11:30:00

最终这样做了:

SET @myStart = '2012-10-01 09:15:00';
SET @myEnd = NULL;
SET @prevEnd = NULL;
SELECT a.endDateTime, b.startDateTime, @myStart := a.endDateTime
FROM appointment a, appointment b, (
    SELECT @myEnd := min(c.startDateTime) 
    FROM appointment c 
    WHERE c.startDateTime >= @myStart
    ORDER BY startDateTime ASC
) as var , 
(SELECT @prevEnd := NULL) v
WHERE a.appointment_id = (
    SELECT appointment_id 
    FROM (
        SELECT appointment_id, max(endDateTime), @prevEnd := endDateTime 
        FROM appointment d
        WHERE (@prevEnd IS NULL OR @prevEnd = d.startDateTime) 
            AND d.startDateTime >= @myEnd
    ) as z
) 
    AND b.startDateTime > a.endDateTime 
ORDER BY b.startDateTime ASC LIMIT 0,10;

这不会返回任何结果。我猜这是因为我的用户定义变量的初始化不正确(刚刚发现它们,我可能完全错误地使用它们)。

如果我只运行第一个子查询,其目标是在 @myStart 之后的第一次约会时初始化 @myEnd,我可以看到它实际上返回 09:15:00。

第二个子查询(SELECT @prevEnd := NULL) v旨在每次在主查询中选择一行时将@prevEnd设置回NULL。我不太确定它是这样工作的...

最后一个子查询的意思是,以 null @prevEnd 和初始化的 @myEnd 开始,选择后面有一个间隙的约会。如果与查询的其余部分分开,我可以验证它是否也可以工作。

您对我可以采取什么措施来修复该查询、我可以/应该如何做或者是否可能这样做有什么建议吗?

提前非常感谢。

编辑:我已经这样编辑了:

SELECT * 
    FROM (
        SELECT COALESCE( s1.endDateTime,  '0000-00-00 00:00:00' ) AS myStart, MIN( s2.startDateTime ) AS minSucc
        FROM appointment s1
        RIGHT JOIN appointment s2 ON s1.endDateTime < s2.startDateTime
            AND s1.radiologyroom_id = s2.radiologyroom_id
        WHERE s1.startDateTime >=  '2012-10-01 00:00:00'
            AND s1.radiologyroom_id =174
            AND s1.endDateTime <  '2013-01-01 00:00:00'
        GROUP BY myStart
        ORDER BY s1.startDateTime
    )s
WHERE NOT 
    EXISTS (
        SELECT NULL 
        FROM appointment
        WHERE startDateTime >= myStart
            AND endDateTime <= minSucc
            AND radiologyroom_id =174
        ORDER BY startDateTime
    )

它在 14.6 秒内检索了 6530 条记录中的 369 行

最佳答案

如果 ids 之间没有间隙,并且 id 始终在增加,您可以使用以下内容:

SELECT coalesce(s1.endDateTime, '0000-00-00 00:00:00'), s2.startDateTime
FROM
  slots s1 right join slots s2
  on s1.appointment_id=s2.appointment_id-1
WHERE coalesce(s1.endDateTime, '0000-00-00 00:00:00')<s2.startDateTime
LIMIT 10

编辑:您也可以尝试以下操作:

SELECT * FROM
  (SELECT
     coalesce(s1.endDateTime, '0000-00-00 00:00:00') as start,
     min(s2.startDateTime) minSucc
   from slots s1 right join slots s2
        on s1.endDateTime<s2.startDateTime
   group by start) s
WHERE
  not exists (select null
              from slots
              where startDateTime>=start
              and endDateTime<=minSucc)

编辑2:我承认我对变量查询不太实用,但这看起来可以工作:

select d1, d2 from (
  select
    @previous_end as d1,
    s.startDateTime as d2,
    @previous_end:=s.endDateTime
  from (select startDateTime, endDateTime from slots order by startDateTime) s,
       (select @previous_end := '0000-00-00 00:00:00') t) s
where d1<d2

关于MySQL:更改每个选定行的用户变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13819420/

相关文章:

mysql - 有没有办法在 CREATE TABLE 语句中使用用户定义的变量作为列长度?

php - 重复条目 mysql 和 php

MySQL 查询性能 : individuate and rewrite faster query

sql - 将两个 SQL 查询的结果组合到一个表中但不使用联合

mysql - mysql更新语句中的用户变量

mysql - 将 MYSQL 行导出到多个 txt 文件中

jquery - 未发送参数时获取 MySQL 查询的所有结果

php - SQL查询更新两次

php - PHP 中的 SQL 语法错误