Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сортировка по 2м датам

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
VestCoastman
Отправлено: 28 Августа, 2013 - 04:29:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Например в таблице comments есть 2 колонки с временем - createtime и updatetime
время в timestamp естесно
Запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM comments ORDER BY createtime DESC, updatetime DESC

Такой запрос вначале отсортирует и выведет comments по createtime, а уже затем по updatetime.
Как сделать так, чтобы createtime и updatetime чередовались в зависимости от времени?
 
 Top
EuGen Администратор
Отправлено: 28 Августа, 2013 - 09:12:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Неясно, что Вы хотите. Какой порядок должен быть, в случае

CODE (htmlphp):
скопировать код в буфер обмена
  1. +----+---------------------+---------------------+
  2. | id |      createDate     |     updateDate      |
  3. +----+---------------------+---------------------+
  4. |  1 | 2013-08-10 01:00:00 | 2013-08-10 02:30:00 |
  5. +----+---------------------+---------------------+
  6. |  2 | 2013-08-10 02:10:00 | 2013-08-10 03:15:00 |
  7. +----+---------------------+---------------------+
  8. |  3 | 2013-08-10 03:00:00 | 2013-08-10 03:10:00 |
  9. +----+---------------------+---------------------+
  10. |  4 | 2013-08-10 01:30:00 | 2013-08-10 02:00:00 |
  11. +----+---------------------+---------------------+
  12. |  5 | 2013-08-10 02:20:00 | 2013-08-10 04:30:00 |
  13. +----+---------------------+---------------------+

(то есть как в конечном результате должны будут расположиться id)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 28 Августа, 2013 - 15:52:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Порядок получается смешанным
Я тут подумал, получается надо объединить значения столбцов createDate и updateDate, а затем order by название_объединения desc, но как реализовать незнаю.
Таблица должна получится такой:
CODE (htmlphp):
скопировать код в буфер обмена
  1. # dates - название_объединения
  2. +----+--------------------------------+
  3. | id | dates(createDate и updateDate) |
  4. +----+--------------------------------+
  5. |  5 |       2013-08-10 04:30:00      | - updateDate
  6. +----+--------------------------------+
  7. |  2 |       2013-08-10 03:15:00      | - updateDate
  8. +----+--------------------------------+
  9. |  3 |       2013-08-10 03:10:00      | - updateDate
  10. +----+--------------------------------+
  11. |  3 |       2013-08-10 03:00:00      | - createDate
  12. +----+--------------------------------+
  13. |  1 |       2013-08-10 02:30:00      | - updateDate
  14. +----+--------------------------------+
  15. |  5 |       2013-08-10 02:20:00      | - createDate
  16. +----+--------------------------------+
  17. |  2 |       2013-08-10 02:10:00      | - createDate
  18. +----+--------------------------------+
  19. |  4 |       2013-08-10 02:00:00      | - updateDate
  20. +----+--------------------------------+
  21. |  4 |       2013-08-10 01:30:00      | - createDate
  22. +----+--------------------------------+
  23. |  1 |       2013-08-10 01:00:00      | - createDate
  24. +----+--------------------------------+
 
 Top
EuGen Администратор
Отправлено: 28 Августа, 2013 - 15:58:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, createDate AS orderDate FROM comments
  2. UNION ALL
  3. SELECT id, updateDate AS orderDate FROM comments
  4. ORDER BY orderDate DESC

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 28 Августа, 2013 - 16:22:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




EuGen пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, createDate AS orderDate FROM comments
  2. UNION ALL
  3. SELECT id, updateDate AS orderDate FROM comments
  4. ORDER BY orderDate DESC

?

А если в таблице помимо id,createDate и updateDate есть еще масса полей, которые нужно вывести, т.е. - *, они ведь не выведутся, верно?
 
 Top
EuGen Администратор
Отправлено: 28 Августа, 2013 - 16:26:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Добавьте их в Ваш UNION, наподобие
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, createDate AS orderDate FROM comments
  2. UNION ALL
  3. SELECT *, updateDate AS orderDate FROM comments
  4. ORDER BY orderDate DESC


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 28 Августа, 2013 - 16:59:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




А если в таблице еще пара join'ов присутствуют?
Не буду томить, покажу целый запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `t`.id, `t`.title, `t`.uid, `t`.username, `t`.createTime, `t`.updateTime
  2.         FROM `tops` AS `t`
  3.         INNER JOIN `cats` AS `c`
  4.                 ON `t`.cid = `c`.id
  5.         INNER JOIN `secs` AS `s`
  6.                 ON `c`.sid = `s`.id
  7.         WHERE   `t`.cid = '2' AND username='admin'
  8.         ORDER BY title DESC, `ТУТ createTime И updateTime` DESC LIMIT 0,10

(Отредактировано автором: 28 Августа, 2013 - 17:10:05)

 
 Top
EuGen Администратор
Отправлено: 28 Августа, 2013 - 17:08:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Для UNION ALL нет никакой разницы, поскольку он собирает данные апостериорно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 28 Августа, 2013 - 17:19:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




Получилась вот такая джигурда)), но где то косяк, данные выводятся дважды, понять не могу, где?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `t`.id, `t`.title, `t`.uid, `t`.username, `t`.createTime, `t`.updateTime, `t`.createTime AS times
  2.     FROM `tops` AS `t` UNION ALL
  3. SELECT `t`.id, `t`.title, `t`.uid, `t`.username, `t`.createTime, `t`.updateTime, `t`.updateTime AS times
  4.     FROM `tops` AS `t`
  5.     INNER JOIN `cats` AS `c`
  6.         ON `t`.cid = `c`.id
  7.     INNER JOIN `secs` AS `s`
  8.         ON `c`.sid = `s`.id
  9.     WHERE   `t`.cid = '2' AND username='admin'
  10.     ORDER BY title DESC, `times` DESC LIMIT 0,10

(Отредактировано автором: 28 Августа, 2013 - 17:24:56)

 
 Top
EuGen Администратор
Отправлено: 28 Августа, 2013 - 17:25:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Они и будут выводиться дважды. Вы же сами указали это:
VestCoastman пишет:
Таблица должна получится такой:
CODE (htmlphp):
скопировать код в буфер обмена

# dates - название_объединения
+----+--------------------------------+
| id | dates(createDate и updateDate) |
+----+--------------------------------+
| 5 | 2013-08-10 04:30:00 | - updateDate
+----+--------------------------------+
| 2 | 2013-08-10 03:15:00 | - updateDate
+----+--------------------------------+
| 3 | 2013-08-10 03:10:00 | - updateDate
+----+--------------------------------+
| 3 | 2013-08-10 03:00:00 | - createDate
+----+--------------------------------+
| 1 | 2013-08-10 02:30:00 | - updateDate
+----+--------------------------------+
| 5 | 2013-08-10 02:20:00 | - createDate
+----+--------------------------------+
| 2 | 2013-08-10 02:10:00 | - createDate
+----+--------------------------------+
| 4 | 2013-08-10 02:00:00 | - updateDate
+----+--------------------------------+
| 4 | 2013-08-10 01:30:00 | - createDate
+----+--------------------------------+
| 1 | 2013-08-10 01:00:00 | - createDate
+----+--------------------------------+

- то есть, с повторениями. В противном случае порядок неопределён и неоднозначен.

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VestCoastman
Отправлено: 28 Августа, 2013 - 17:37:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




[quote=EuGen][/quote]
Однако Ого, точно, мой косяк.
Подразумевалось, что порядок будет смешанным между двух столбцов. Но в принципе, уже неважно.

Подумал я, а почему бы при создании поля в таблице "tops", полю "updateDate" не назначать тоже значение, что и в createDate, а не ноль, как у меня сейчас.
В таком случае, никаких юнионов не потребуется и сортировка будет просто по столбцу "updateDate".

Иногда решение проще чем предполагается, а я, блин, пол дня на это потратил, мне стыдно за себя Хм

Спасибо, EuGen. Тему можно закрывать.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB