MYSQL заказ по дате публикации и нарушениям отметки времени - PullRequest
1 голос
/ 26 мая 2011

Я пытаюсь составить список новостей, используя php и mysql, основываясь на дате публикации и отметке времени в новостной статье. Мне нужно перечислить все статьи с самой новой датой публикации и самой последней отметкой времени. Я получаю некоторые нарушения в списках, когда я пытаюсь сделать это.

Отметим, что некоторые новостные статьи могут иметь отметку времени сегодня, но дата публикации 10 с этого момента.

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY pubdate,date DESC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY date,pubdate DESC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY pubdate,date ASC

SELECT * FROM table_news WHERE pubdate <= ".time()." ORDER BY date,pubdate ASC

Ни одна из этих работ ...

Я могу перечислить некоторые результаты, но я подумал, что это может быть немного излишним. Дайте мне знать, если вы хотите их увидеть.

Я либо упускаю что-то очевидное (долгие часы на этой неделе ...), либо есть более творческий подход к этому.

Спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 26 мая 2011

Является ли ваше поле pubdate временной картой Unix (например, целочисленным полем) или фактическим полем даты / времени mysql? time() возвращает метку времени Unix, а не строку даты / времени. Используйте это вместо:

SELECT *
FROM table_news
WHERE pubdate <= now()
ORDER BY pubdate DESC, date DESC

Обратите внимание на DESC в обоих полях в предложении order by. если вы не укажете явно asc / desc для каждого поля в предложении order-by, SQL задает значение по умолчанию ASC.

1 голос
/ 26 мая 2011

Я предполагаю здесь, но я думаю, что знаю, что вы ожидали ORDER BY, чтобы сделать.

При упорядочении по двум столбцам вы не получите самые последние и самые новые, вы получите все записи, упорядоченные по первому столбцу в этом предложении ORDER BY, и только если две строки имеют одинаковое значение, эти две будут упорядочены второй столбец.

Вы можете попробовать, если это работает, как ожидалось:

SELECT *
FROM table_news
WHERE pubdate <= ".time()."
ORDER BY MAX(pubdate,date) DESC

Это будет порядок на любую более позднюю дату.

1 голос
/ 26 мая 2011

Вам необходимо использовать форматированную дату MySQL в строке запроса.Попробуйте

SELECT NOW();

, чтобы увидеть, как выглядит дата в формате MySQL.Возможно, вы захотите использовать функцию NOW () непосредственно в своем запросе вместо использования функции PHP time ().

SELECT * FROM table_news WHERE pubdate <= NOW() ORDER BY ...

Функция PHP time () возвращает метку времени Unix (секунды с полуночи 1 января)1970 UTC).Функции MySQL FROM_UNIXTIME () и UNIX_TIMESTAMP () могут использоваться для преобразования из и в метки времени Unix.

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

SELECT * FROM table_news WHERE pubdate < FROM_UNIXTIME(1306421037)

может использовать индекс на pubdate, но

SELECT * FROM table_news WHERE unix_timestamp(pubdate) < 1306421037

не может использовать индекс на pubdate, потому что индекс находится на pubdate, а не на unix_timestamp (pubdate) (MySQL не поддерживает функциональные индексы).

1 голос
/ 26 мая 2011
SELECT * FROM table_news WHERE pubdate <= NOW() ORDER BY pubdate,date DESC

PHP time () возвращает текущее время как метку времени Unix, которая использует формат, сильно отличающийся от метки времени MySQL. Вы можете использовать NOW (), чтобы получить текущую метку времени в MySQL.

...