我试图按照一些不同的标准对访问者列表进行排序并陷入困境,因为我无法弄清楚,如何做到这一点。
我有一个先检查的人员队列,然后生成列表。客户被标记为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
那么我怎样才能在列表末尾看到已故的阵雨? 非常感谢你提前!
答案 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;