这种需求sql写法

壹丶贰 发布于 2017/04/09 10:16
阅读 371
收藏 1

 

数据结构如下

 user_info
              id           name
              1             张三
              2              李四
             3               王五
             4               马六
             5               赵七
duty_info
              id   user_id   duty_date
              1         1           2017-4 -1
              2         1            2017-4-2

查询语句

select * from  user_info u left jion  duty_info on  u.id=d.user_id 
where 
(
        d .duty_date IN (
            '2017-04-03',
            '2017-04-04',
            '2017-04-05',
            '2017-04-06',
            '2017-04-07',
            '2017-04-08',
            '2017-04-09'
        )
        OR d .duty_date IS NULL
    )

测试数据大概是这样    我想查出所有人在指定几个日期的排班   没有排班也要查出来   但是我用上面SQL没有张三的数据

加载中
0
xwtdroid
xwtdroid

张三有数据的是‘2017-4 -1’和‘2017-4 -2’,但是你的d.duty_data in 里面没有包含这两个日期

xwtdroid
xwtdroid
回复 @壹丶贰 : 那加日期筛选不是没有意义了吗,反正没有日期记录的也要显示出来。你试试把where条件筛选去掉呢?
壹丶贰
壹丶贰
是的 但是我是想查所有人的 我加了个OR duty_date is null就是把没有排班的显示出来了 但是有排班但不在我这个日期内的 就不出来了
0
w
wxsl

这种只能是先查询duty_info的duty_date,然后user_info左连接duty_info查询到的结果集

0
纳兰清风
纳兰清风
把where条件放到on里试试
0
小乌蝇

张三的duty_date没有在你筛选的日期内也不是null,当然木有显示啦

0
风翔飞
风翔飞

WHERE 改成and ,where只能筛选出符合条件的,你要查询的是以user_info为主体,所以需要left join duty_info,要筛选的也是duty_info的记录,所以不能用where

a left join b on a.id = b.a_id and xxx and xxx   中on后面的查询条件都是筛选b表数据,对a没影响

0
凡8尘
select * from  user_info u left jion  duty_info on  (u.id=d.user_id and (
        d .duty_date IN (
            '2017-04-03',
            '2017-04-04',
            '2017-04-05',
            '2017-04-06',
            '2017-04-07',
            '2017-04-08',
            '2017-04-09'
        )
        OR d .duty_date IS NULL
    )
)

 

0
魔力猫
魔力猫
select * from (
select * 
from  user_info u 
left join  duty_info d on  u.id=d.user_id 
) where 
(
        duty_date IN (
            '2017-04-03',
            '2017-04-04',
            '2017-04-05',
            '2017-04-06',
            '2017-04-07',
            '2017-04-08',
            '2017-04-09'
        )
        OR duty_date IS NULL
    )

这个理论上应该满足你的要求了吧。不过这个样子效率未必好。

风翔飞
风翔飞
回复 @魔力猫 : 这样查询和楼主的结果一样,问题是楼主需求是找出所有人的排班(包含没有排班的),用where的话只能找出排班过的,用left join 筛选日期比较合适
魔力猫
魔力猫
回复 @风翔飞 : 先把两个表的结果做成一个结果集,然后再对结果集过滤。
风翔飞
风翔飞
这个和楼主的有何区别。。。
返回顶部
顶部