Как отсортировать запрос PHP / MySQL по определенным правилам по времени суток? - PullRequest
0 голосов
/ 20 января 2012

В моем приложении пользователь может выбрать, когда следует указывать конкретные элементы (утром, днем, вечером, полуночью или по мере необходимости). Мне нужно распечатать сводную страницу, которая отображается, когда нужно дать каждый элемент. Правила, которые я пытаюсь установить для своего порядка сортировки, следующие:

  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);

Любые идеи о том, как я могу реализовать вышеуказанные правила?

Ответы [ 3 ]

1 голос
/ 20 января 2012

Ответ Джеймса в значительной степени такой, как я бы его кодировал, но в его примере 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 до конца, затем мы выдвигаем записи, которые имеют morning = 1наверх и упорядочиваем их по количеству выбранных раз, затем мы перемещаем записи с вторником = 1 и так далее.

0 голосов
/ 20 января 2012

В таблице не должно быть столбца для каждого таймфрейма, если в каждой строке будет использоваться только один таймфрейм. У вас должен быть только один столбец, чтобы определить временные рамки записи. Так что сделай свой стол таким.

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

Вы упорядочиваете порядок таймфреймов по номеру сортировки в таблице таймфреймов. Тогда каждая строка будет связана с таймфреймом. Сделав это, вы можете изменить порядок таймфреймов, не изменяя код и не изменяя каждую строку в таблице правил (иначе времена).

0 голосов
/ 20 января 2012

Если утро и т. Д. Являются числовыми, вы можете сделать:

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 из другого автора.

...