[英]How to sort PHP/MySQL query with specific rules to order by time of day?
在我的應用程序中,用戶可以選擇何時應指定特定項目(上午,下午,晚上,午夜或根據需要)。 我需要打印一個摘要頁面,該頁面顯示何時應給出每個項目。 我要為排序順序設置的規則如下:
這是一個例子:
我正在使用PHP和MySQL,這是到目前為止的查詢:
$sth = $dbh->query("SELECT morning
afternoon,
evening
midnight
as_needed
FROM times
WHERE user_id = $user_id
ORDER BY as_needed,
morning DESC,
afternoon DESC,
evening DESC,
midnight DESC", PDO::FETCH_ASSOC);
關於如何執行上述規則有什么想法?
James的答案幾乎是我的編碼方式,但是在他的示例中,not_as_needed_times排序不正確,因為您要求應將次數最少的項目放在首位。
編輯:好的,這個龐然大物將照顧一切 :
$sth = $dbh->query("SELECT
(as_needed + morning + afternoon + evening + midnight) AS total_items,
IF((morning + afternoon + evening + midnight) = 0, 0, 1) AS not_as_needed_times,
morning, afternoon, evening, midnight, as_needed
FROM times
WHERE user_id = $user_id
ORDER BY not_as_needed_times DESC, morning DESC, total_items ASC, afternoon DESC, total_items ASC, evening DESC, total_items ASC, midnight DESC, total_items ASC
");
首先,我們將not_as_needed_times移至末尾,然后將上午= 1的記錄推至頂部,並按選定的次數對它們進行排序,然后將周二= 1的記錄移動,依此類推。
如果早晨等是數字,則可以執行以下操作:
SELECT (morning + afternoon + evening + midnight + as_needed) as total_items,
IF((morning + afternoon + evening + midnight) = 0, 0, 1) as not_as_needed_items,
morning, afternoon, evening, midnight, as_needed
FROM times
WHERE user_id = $user_id
ORDER BY not_as_needed_items desc, total_items asc
not_as_needed的降序排序僅將as_needed放在底部求解(3)上。 total_items asc按#個總項目排序,求解(2)。 由於所有時間都在一行中,所以這只是(1)的顯示邏輯問題。
編輯:合並了來自其他海報的not_as_needed_items的修復程序。
如果每一行僅使用一個時間范圍,則該表在每個時間范圍內都不應包含一列。 您應該只有一欄來標識記錄的時間范圍。 因此,使您的桌子像這樣。
times
---------------
row_id
user_id
timeframe_id
rule
timeframes
---------------
timeframe_id
name
order
SELECT * FROM times t INNER JOIN timeframes tf USING (timeframe_id) WHERE user_id = $user_id ORDER BY tf.order
SELECT * FROM times t INNER JOIN timeframes tf USING (timeframe_id) WHERE user_id = $user_id AND tf.timeframe_id = '$selected_timeframe' ORDER BY tf.order
您在時間范圍表中排列時間順序和排序編號。 然后,每一行將與一個時間范圍相關聯。 完成此操作后,您可以更改時間范圍的順序,而無需修改代碼,也無需更改規則表中的每一行(也稱為時間)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.