Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择类型上的所有数据,如果存在行,则更改“选择”_Mysql_Sql - Fatal编程技术网

Mysql 选择类型上的所有数据,如果存在行,则更改“选择”

Mysql 选择类型上的所有数据,如果存在行,则更改“选择”,mysql,sql,Mysql,Sql,我是新来的,所以如果我发错了,请重定向我 对不起,我还不能发布图片 我有这个表,我想选择所有类型='Maladie' 但是如果类型为'Reprise'的行包含任何maladie类型之间的日期,则我必须显示 马拉迪行日期开始->重新设置行日期开始 而不是 马拉迪行日期开始->马拉迪行日期结束 那个图像的结果是这样的 注意:类型为REPRESE的行可能存在,也可能不存在 thnks外部连接重新设置记录。如果找到匹配项,请使用其日期,如果不使用原始日期: select m.mat, m.s

我是新来的,所以如果我发错了,请重定向我 对不起,我还不能发布图片

我有这个表,我想选择所有类型='Maladie' 但是如果类型为'Reprise'的行包含任何maladie类型之间的日期,则我必须显示 马拉迪行日期开始->重新设置行日期开始 而不是 马拉迪行日期开始->马拉迪行日期结束

那个图像的结果是这样的

注意:类型为REPRESE的行可能存在,也可能不存在


thnks

外部连接重新设置记录。如果找到匹配项,请使用其日期,如果不使用原始日期:

select
  m.mat,
  m.start,
  coalesce(r.end, m.end) as end,
  m.number_days,
  m.number_hours
from (select * from mytable where type = 'Maladie') m
left join (select * from mytable where type = 'Reprise') r 
              on r.mat = m.mat and r.start between m.start and m.end;
如果每个maladie日期范围内可能有多条重播记录,并且您希望先录制一条,请使用:

select
  m.mat,
  m.start,
  coalesce(r.repday, m.end) as end,
  m.number_days,
  m.number_hours
from (select * from mytable where type = 'Maladie') m
left join 
(
  select mat, min(end) as repday
  from mytable 
  where type = 'Reprise' 
  group by mat
) r on r.mat = m.mat and r.repday between m.start and m.end;

您需要创建自联接和筛选器类型,如果有多个重新发布,则使用min来捕获第一个日期

SELECT a.mat
    ,a.start
    ,min(coalesce(b.END, a.END)) AS END
    ,a.number_of_days
    ,a.number_of_hours
    ,type
FROM table1 a
LEFT JOIN (
    SELECT mat
        ,start AS start
        ,END AS END
    FROM table1 t
    WHERE t.type = 'Reprise'

    ) b ON b.start BETWEEN a.start
        AND a.END and a.mat=b.mat
WHERE type = 'Malaide'
GROUP BY a.mat
,a.start
ORDER BY start

重播是否总是只覆盖一天?两条重发记录能否与主表记录匹配?那该怎么办?是的,一定有一天这是一张疾病假期表,你总能在疾病假期结束前恢复健康并返回工作。根据标准SQL,这是无效的。在派生查询中,您按mat分组,并获得其一个开始和一个结束(因为您没有使用聚合函数(如MIN或MAX)来说明是哪个开始和结束)。你可以从一个记录开始,从另一个记录结束,尽管这不太可能。即使是仅从一条记录中获取的数据,当每个mat有多条重放记录时,也会任意抑制其他记录。。