簡體   English   中英

如何按特定時間對具有特定規則的PHP / MySQL查詢進行排序?

[英]How to sort PHP/MySQL query with specific rules to order by time of day?

在我的應用程序中,用戶可以選擇何時應指定特定項目(上午,下午,晚上,午夜或根據需要)。 我需要打印一個摘要頁面,該頁面顯示何時應給出每個項目。 我要為排序順序設置的規則如下:

  1. 項目應始終按時間順序顯示,早上在前,午夜在后
  2. 有多次要給出的項目,應該以最少的先發次數進行排序(即,如果項目#2是在下午,午夜和需要時給出的,而項目3應該在下午,晚上,午夜給出的然后根據需要在第2項中列出)
  3. 僅在需要時給出的項目應列在最后

這是一個例子:

  • 項目#1:早上,晚上
  • 項目2:根據需要在下午,午夜
  • 項目3:根據需要,下午,晚上,午夜
  • 項目#4:晚上
  • 項目5:根據需要

我正在使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM