Ваш вышеупомянутый запрос работает, за исключением , что, когда вы 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
, потому что, кажется, он лучше соответствует вашему первоначальному вопросу.)
Изменение состоит в том, что нет группировки - только упорядочение по дате.
Поскольку ваши выходные данные упорядочены по дате, названия дней также будут в порядке.
Вы можете сделать что-то подобное в своем php:
$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'];
}