Выборка из MySQL и сортировка в зависимости от того как заполнены поля таблицы.

Страшный Злодей

Бывший член клуба (достало хамство).
Выборка из MySQL и сортировка в зависимости от того как заполнены поля таблицы.

В базе MySQL есть таблица, где существует одна (обязательная) колонка с датой создания записи, а другая (необязательная) с датой редактирования записи. Как составить запрос так, чтобы в результате получилась выборка отсортированная по дате, где, в случае заполненой "даты редактирования" - датой считать "дату редактирования", а в остальный случаях датой считать "дату создания"?
 
Bitterman
Зачем только это?
Ну, неужель не понятно? Это нужно для того чтобы получить таблицу отсортированную по дате последнего обновления информации (трабл в том, что информация не везде обновлялась и тогда датой обновления считается дата создания записи)...

PHP:
|num |content|   create     |    update     |
----------------------------------------------------
|3215| items1 |2007-11-24| 2007-11-26 |
|3216| items2 |2007-11-27|                   |
|3217| items3 |2007-11-25|                   |
|3218| items4 |2007-11-23| 2007-11-24 |
sql запрос должен дать следующий порядок выборки:

items2 -> 2007-11-27
items1 -> 2007-11-26
items3 -> 2007-11-25
items4 -> 2007-11-24

Как это реализовать с помощью ORDER BY IF(...) я пока не понял...
 
Это нужно для того чтобы получить таблицу отсортированную по дате последнего обновления информации (трабл в том, что информация не везде обновлялась и тогда датой обновления считается дата создания записи)...
почему бы сразу не создавать запись с create = update?

Как это реализовать с помощью ORDER BY IF(...) я пока не понял...
ORDER BY IFNULL(`update`, `create`)
 
Автор оригинала: zerkms
почему бы сразу не создавать запись с create = update?
нужны обе записи.

ORDER BY IFNULL(`update`, `create`)
спасибо, помогло.

теперь вот думаю, как бы доработать запрос, что бы в результате, вместо
PHP:
num      |  items     |   create          |update           |
---------+------------+------------------+----------------+
3216    |   items2   |  2007-11-27  |  NULL              |
3215    |   items1   |  2007-11-24  |  2007-11-26    |
3217    |   items3   |  2007-11-25  |  NULL              |
3218    |   items4   |  2007-11-23  |  2007-11-24    |

получать такое:
PHP:
num      |  items     |  date            |
---------+------------+----------------+
3216    |   items2   |  2007-11-27  | 
3215    |   items1   |  2007-11-26  |  
3217    |   items3   |  2007-11-25  |  
3218    |   items4   |  2007-11-24  |
 
SELECT *, IFNULL(`update`, `create`) AS `date`

алёёёёёё, уже пора включать моск
 
zerkms
я туплю... сорри. Всю ночь кодил, пойду поспать пару часов. А то следующий мой вопрос повергнет всех в ужас..
 
Автор оригинала: Bitterman
Страшный Злодей

Ну так пиши в при создании в update то же время, что и в create. А потом, при редактировании перезаписывай.
незя... во первых, таблица и так уже более 7mb, а во вторых, что важнее, иногда требуется проверка того была ли какая-то запись, вообще, хоть раз обновлена.
 
> во первых, таблица и так уже более 7mb
Это должно повергать в ужас?

> а во вторых, что важнее, иногда требуется проверка того была ли какая-то запись, вообще, хоть раз обновлена.
Ну так и что мешает это делать? Если create равно update - значит, запись не редактировали.
 
>>во первых, таблица и так уже более 7mb

у тебя 8ядерный проц и 32 гига памяти, но винт на 200 метров?

иначе я не понимаю логику по которой фигачить на каждый пук filesort выгоднее
 
fixxxer
при 8mb базе, на самом деле, пофиг как сортировать :-)
 
Автор оригинала: SiMM
Это должно повергать в ужас?
Нет конечно, паниковать не стоит. Но учитывая кол-во вызовов (в минуту более 300) нагрузка на сервер ощутима. База на хостинге (не выделенный сервер) => рессурсы ограничены. В таких условиях иногда приходится работать :)

Ну так и что мешает это делать? Если create равно update - значит, запись не редактировали.
Ни что не мешает, только если все-равно использовать и сравнивать create и update, то какой смысл менять способ хранения данных в базе и способ извлечения? Что выигрывается?

P/S: забыл добавить, что база пересылается на сервер по e-mail (при чём в формате excel). Так, что вобщем, каждый КБ имеет вес.
 
иногда требуется проверка того была ли какая-то запись, вообще, хоть раз обновлена
кол-во вызовов (примечание, сортировок) в минуту более 300, нагрузка на сервер ощутима
это и есть ответ зачем нужно менять "структуру хранения", размер excel'я чудесно уменьшается gzip,bzip2,zip
 
Gas
Ну и почему проверку на, то была ли запись обновлена, нельзя произвести в базе в том виде как она сейчас есть?

это и есть ответ зачем нужно менять "структуру хранения", размер excel'я чудесно уменьшается gzip,bzip2,zip
Поясните, где здесь ответ? Не могу не согласиться с тем, что архивация имеет свойство уменьшать объем файла. Жаль не до значения "0"...
 
Страшный Злодей, потому что ORDER BY IFNULL (field1, field2) посылает индексы в задницу, в отличии от WHERE field1 = field2
 
Ну и почему проверку на, то была ли запись обновлена, нельзя произвести в базе в том виде как она сейчас есть?
можно всё оставить и как есть, просто тебе пытаются подсказать как сделать быстрее твой запрос с сортировкой.

архивация имеет свойство уменьшать объем файла
намного изменится размер архива c xls файлом, если одна из колонок станет не пустой (если в документе более 5-ти колонок)? Мне кажется, незначительно.
 
Модераторы, прошу прощения за офтоповость дальнейших слов, но тему не прибивайте пожалуйста. Здесь где-то порылось что-то важное, что я упускаю из виду, хочется докопаться.
dimagolov
потому что ORDER BY IFNULL (field1, field2) посылает индексы в задницу, в отличии от WHERE field1 = field2
Чего-то не понимаю, каким образом WHERE может помочь. Сейчас в ранее описаной структуре таблицы юзаю приблизительно такой sql запрос:
PHP:
SELECT `num` , IFNULL( `update` , `create` ) AS `date`
FROM `report`
ORDER BY `date` DESC
LIMIT 0 , 1000
Как здесь можно что-то оптимизировать с помощью WHERE и/или путём изменения свойств таблицы?
 
Сверху