Ваш запрос выше делает работу, за исключением что, когда вы GROUP BY
один столбец, вы должны каким-то образом агрегировать все остальные.
Например, GROUP BY Day
возвращает одну запись за каждый день. Если в течение каждого дня вводится несколько записей, и вы запрашиваете их id
, title
, category
и т. Д., Как MySQL знает, какой из них вам показать, так как он только показывает вам одну строку? (Обычно он показывает «первую» строку для каждого дня, как они появляются в "SELECT * FROM mytable"
, но вы не должны полагаться на это).
Решение состоит в том, что вы каким-то образом объединяете все эти индивидуальные свойства, такие как id
, в одну строку на группу. Вы можете использовать GROUP_CONCAT
для этого, как предлагает @narcisradu.
SELECT
GROUP_CONCAT(cms_news.news_id),
GROUP_CONCAT(cms_news.news_title),
DAYOFMONTH(FROM_UNIXTIME(cms_news.news_date)) as Day,
GROUP_CONCAT(cms_news.news_category),
GROUP_CONCAT(cms_news.news_source),
GROUP_CONCAT(cms_news.news_type),
GROUP_CONCAT(cms_news.news_content)
FROM
cms_news cms_news,
GROUP BY
DAYOFMONTH(FROM_UNIXTIME(cms_news.news_date))
ORDER BY
cms_news.news_date DESC
Это даст вам например .:
1,4 Story 1 Title, Story 2 Title <Day1> Funny,Sad ....
Т.е. Иды, заголовки, категории, источники, типы и содержимое превращаются в одну строку, разделенную запятыми, в день.
Однако похоже, что это не совсем соответствует вашим целям (наличие одной строки с содержимым всех статей в этот день кажется бессмысленным).
Я думаю, что вы должны сделать запрос:
SELECT
cms_news.news_id,
cms_news.news_title,
DAYNAME(FROM_UNIXTIME(cms_news.news_date)) AS Day,
cms_news.news_category,
cms_news.news_source,
cms_news.news_type,
cms_news.news_content
FROM
cms_news cms_news,
ORDER BY news_date DESC
(Заметьте, я изменил свой DAYOFMONTH
на DAYOFWEEK
, потому что кажется, чтобы соответствовать вашему вопросу лучше.)
Изменение в том, что нет никакой группировки - просто заказывая по дате.
Поскольку ваш результат заказан по дате, названия дней также будут в порядке.
Вы можете сделать что-то вроде этого в РНР, то:
$prevday='';
while($row = mysql_fetch_array($res)) {
if ($row['Day'] != $prevday) {
// day has changed!
// make a new row. e.g:
echo "<br/> \n" . $row['Day'];
}
// now just list your article name
echo " - " . $row['news_title'];
$prevday = $row['Day'];
}
удалите запятую перед GROUP BY и запрос будет работать. –
Этот запрос даст только первую строку, соответствующую каждому дню. Это можно сделать с помощью команды GROUP_CONCAT() ', но результат нелегко повторить. Почему вы не можете использовать php? –
Вы должны сделать это через PHP. Большинство решений только для MySQL будут использовать функцию GROUP_CONCAT(), которая ограничивает размер столбца до 1 КБ. Если у вас есть несколько десятков статей, такие запросы не дадут вам полной картины. –