2017-10-10 68 views
2

我是MySQL的新手,請耐心等待我的潛在問題。我需要創建一個查詢來顯示我們不同的成員子類型以及每個子類型在給定日期每小時簽入的次數。這是我到目前爲止:MySQL計數每個會員每個小時的簽到次數

SELECT 
customers.CUSTOMER_CUSTOM_TYPE AS Subtype, 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%17:00:00' AND '%17:59:59' THEN 1 
    ELSE 0 
    END) AS '5pm', 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%18:00:00' AND '%18:59:59' THEN 1 
    ELSE 0 
    END) AS '6pm', 
COUNT(CASE 
    WHEN checkins.POSTDATE BETWEEN '%19:00:00' AND '%19:59:59' THEN 1 
    ELSE 0 
    END) AS '7pm' 
FROM 
checkins, 
customers 
WHERE 
checkins.CUSTOMER_ID = customers.CUSTOMER_ID 
    AND checkins.POSTDATE LIKE '2017-10-05%' 
GROUP BY customers.CUSTOMER_CUSTOM_TYPE; 

爲簡潔起見,我只包括三個小時。儘管POSTDATE發生變化,但我仍然每小時都會收到相同的數字。該表的設置是正確的:

MySQL Membership Subtype Checkin/Hour

在其他簡單的查詢,我對於給定的時間內計算客戶的CHECKIN_ID數簽入。每次登記時,客戶都會得到不同的唯一登記ID。我是否正確地進行了此操作?有一種更簡單的方法嗎?任何幫助表示讚賞!

+0

'COUNT()'應該是'SUM()'。 – Barmar

回答

0

學習使用正確的join語法。 從不from子句中使用逗號。

您的查詢的簡化版本可能是:

SELECT cu.CUSTOMER_CUSTOM_TYPE AS Subtype, 
     SUM(hour(ch.POSTDATE) = 17) AS `5pm`, 
     SUM(hour(ch.POSTDATE) = 18) as `6pm`, 
     SUM(hour(ch.POSTDATE) = 19) as `7pm` 
FROM checkins ch JOIN 
    customers cu 
    ON ch.CUSTOMER_ID = cu.CUSTOMER_ID 
WHERE DATE(ch.POSTDATE) = '2017-10-05' 
GROUP BY cu.CUSTOMER_CUSTOM_TYPE; 

注:

  • 使用表別名。他們使查詢更易於編寫和閱讀。
  • 請勿在日期和時間中使用字符串比較。這會提取比較的日期(如果您在該列上有索引,則可以選擇其他日期)。
  • LIKE圖案不適用於BETWEEN。我用簡單的HOUR()替換了它。
  • 這使用一個MySQL快捷方式將布爾表達式視爲數字上下文中的數字 - 因此不需要case
0

如果你不太依附當前表格的結構,我可能會建議重新設計數據結構,這可能會大大簡化這些信息。

看起來您似乎試圖追蹤三個關鍵信息點:customer_id,roomcheck_in_time。那麼你提到的checkin_id可能是插入到這個表中時產生的PRIMARY KEY值。首先,不要將這些信息按照時間順序排列成一個類似於圖表的表格,而只需跟蹤這三個數據就有很大的價值。

接下來,而不是許多情況下:看看利用GROUP BY聲明。在需要由房劃定的話,那麼它每小時看起來有點像這樣:

SELECT count(*) as num, hour(check_in_time) as hr 
FROM checkins 
Group By room, hr 

這將返回簽入的次數每小時所有客房的所有時間。如果您希望按天或按年分解,只需將時間函數添加到Select和Group語句中即可。