Выборка из 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(...) я пока не понял...
 

zerkms

TDD infected
Команда форума
Это нужно для того чтобы получить таблицу отсортированную по дате последнего обновления информации (трабл в том, что информация не везде обновлялась и тогда датой обновления считается дата создания записи)...
почему бы сразу не создавать запись с 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  |
 

zerkms

TDD infected
Команда форума
SELECT *, IFNULL(`update`, `create`) AS `date`

алёёёёёё, уже пора включать моск
 

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

Бывший член клуба (достало хамство).
zerkms
я туплю... сорри. Всю ночь кодил, пойду поспать пару часов. А то следующий мой вопрос повергнет всех в ужас..
 

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

Бывший член клуба (достало хамство).
Автор оригинала: Bitterman
Страшный Злодей

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

SiMM

Новичок
> во первых, таблица и так уже более 7mb
Это должно повергать в ужас?

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

fixxxer

К.О.
Партнер клуба
>>во первых, таблица и так уже более 7mb

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

иначе я не понимаю логику по которой фигачить на каждый пук filesort выгоднее
 

zerkms

TDD infected
Команда форума
fixxxer
при 8mb базе, на самом деле, пофиг как сортировать :)
 

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

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

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

P/S: забыл добавить, что база пересылается на сервер по e-mail (при чём в формате excel). Так, что вобщем, каждый КБ имеет вес.
 

Gas

может по одной?
иногда требуется проверка того была ли какая-то запись, вообще, хоть раз обновлена
кол-во вызовов (примечание, сортировок) в минуту более 300, нагрузка на сервер ощутима
это и есть ответ зачем нужно менять "структуру хранения", размер excel'я чудесно уменьшается gzip,bzip2,zip
 

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

Бывший член клуба (достало хамство).
Gas
Ну и почему проверку на, то была ли запись обновлена, нельзя произвести в базе в том виде как она сейчас есть?

это и есть ответ зачем нужно менять "структуру хранения", размер excel'я чудесно уменьшается gzip,bzip2,zip
Поясните, где здесь ответ? Не могу не согласиться с тем, что архивация имеет свойство уменьшать объем файла. Жаль не до значения "0"...
 

dimagolov

Новичок
Страшный Злодей, потому что ORDER BY IFNULL (field1, field2) посылает индексы в задницу, в отличии от WHERE field1 = field2
 

Gas

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

архивация имеет свойство уменьшать объем файла
намного изменится размер архива 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 и/или путём изменения свойств таблицы?
 
Сверху