2015-11-18 21 views
2

我试图按照一些不同的标准对访问者列表进行排序并陷入困境,因为我找不出如何执行此操作。与两个表上的许多标准的mysql订单

我有一个首先登记的人排队,并且出于该列表的生成。如果客户来到门口(通过列表中的号码呼叫),客户端会被标记为“已上架”。如果有人迟到,他必须在名单的末尾。另一件事是,该列表每次都以不同的数字开始。

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。这里的标准是:如果你的号码后面的placeNr已经被呼叫(shownUp),比你在结束时列表。

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

两个表中的示例数据和期望的结果将有助于解释问题(或更好的SQL提琴)。 –

+0

@Paddy'placeNr' - > expalin这个字段.. –

回答

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;