Заказ в зависимости от того, какая дата раньше - PullRequest
1 голос
/ 09 июня 2009

Вот сделка. У меня есть статьи и вопросы, обе из которых могут иметь дату выпуска. (Проблемы должны, статьи могут.) Какая бы ни была дата раньше, дата выпуска.

У меня есть вся логика для этого, в основном, отработано, и все это прекрасно работает, за исключением того, что я не могу до конца разобраться в заказе на заказ к этой дате выпуска. Какой самый чистый метод SQL для реализации этой функциональности? Я знаю базовую структуру SQL и все такое, но не такую ​​продвинутую логику ...

Заранее спасибо! --Matchu

Ответы [ 5 ]

1 голос
/ 09 июня 2009

Это будет работать:

order by 
case when article.date is not null and article.date<issue.date then article.date
else issue.date end
0 голосов
/ 09 июня 2009

Вместо того, чтобы искать логику сортировки в предложении ORDER BY (как предлагают другие), я думаю, что вы должны предоставить порядок сортировки «конечному пользователю» через предложение SELECT; если ваша СУБД совместима с SQL-92, вы можете использовать только имена корреляций в предложении ORDER BY, например,

SELECT COALESCE(CASE 
                   WHEN V1.issue_release_date <= V1.article_release_date 
                      THEN V1.issue_release_date
                   ELSE V1.article_release_date 
                END, V1.issue_release_date) AS considered_release_date, 
       <other columns here>
  FROM ...
 ORDER
    BY considered_release_date, <other correlation names here>;
0 голосов
/ 09 июня 2009

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

Чтобы сделать это в одной строке, мы должны сделать некоторые предположения о вашей базе данных. Я покажу вам MySQL, но, возможно, кто-то предоставит перевод в другую СУБД, если это необходимо.

Article.all :include => :issue, :order => "if( (isnull( articles.release_date ) OR articles.release_date > issues.release_date), issues.release_date, articles.release_date )"
0 голосов
/ 09 июня 2009

Если у вас есть таблица с двумя датами (эта часть мне не понятна), а ArticleReleaseDate обнуляется, вам понадобится что-то вроде

ORDER BY (CASE 
   WHEN IssueReleaseDate < ArticleReleaseDate OR ArticleReleaseDate IS NULL
   THEN IssueReleaseDate
   ELSE ArticleReleaseDate
   END)
0 голосов
/ 09 июня 2009

Вы заказываете по базовой дате (журналу), а затем по дате выпуска.

заказ по выпуску, артикул.

Также, если у вас есть номер выпуска, вы можете просто использовать номера, чтобы упорядочить свои материалы, так как объем и номер выпуска постоянно увеличиваются с течением времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...