在两个表

时间:2015-11-18 12:10:41

标签: mysql sql-order-by

我试图按照一些不同的标准对访问者列表进行排序并陷入困境,因为我无法弄清楚,如何做到这一点。

我有一个先检查的人员队列,然后生成列表。客户被标记为showsUp,如果他来到门口(在列表上用他的号码打电话后)。如果有人迟到,他必须在列表的末尾。另一件事是,列表每次都以不同的数字开始。

Day 1 -> List from 1 to 160
Day 2 -> List from 33 to 160, 1 to 32
Day 3 -> List from 65 to 160, 1 to 64

如果有人迟到,意味着他之后的号码已经被调用,他应该被添加到列表的末尾,比如1到160,10迟到,因为20已经被调用,它应该是1到160, 10.如果有另一个起始号,它应该是33到160,1到32,10。这里的标准是:如果你的号码后面的地点N已经被调用(showsUp),那么你就是在列表的末尾。< / p>

clients (id, name, placeNr)
visits (id, pid, checkInTime, showedUp, showedUpTime)

选择

SELECT clients.id AS id, visits.id AS visitId, clients.placeNr AS placeNr, clients.name AS name 
FROM clients, visits 
WHERE clients.id = visits.pid AND visits.checkInTime >= '1447286401' AND visits.checkInTime <= '1447372799' 
ORDER BY clients.placeNr < '1', if(visits.showedUpTime < visits.checkInTime, clients.placeNr, 1), ttc.placeNr

那么我怎样才能在列表末尾看到已故的阵雨? 非常感谢你提前!

1 个答案:

答案 0 :(得分:0)

如果我遵循你的逻辑,你需要指明某人是否迟到。以下是此类查询所需的结构。我想我已经在你的问题中捕捉了规则:

select v.id, v.id AS visitId, c.placeNr, c.name,
       (case when v.showedUpTime >
                  (select min(v.checkInTime)
                   from visits v2 join
                        clients c2
                        on v2.pid = c2.id
                   where date(v2.showedUpTime) = date(v.showedUpTime) and
                         c2.placeNr > c.placeNr
                  )
             then 1 else 0 end) as IsLate
from clients c join
     visits v
     on c.id = v.pid
order by date(v.showedUpTime),
         isLate,
         c.placeNr;