2015-11-18 62 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;