你上面的查詢不工作,除了,當你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 ....
即每日的ID,標題,類別,來源,類型和內容將變成一個以逗號分隔的字符串。
但是,它似乎不適合你的目的(有一個字符串與當天的所有文章的內容似乎無意義)。
我想你應該讓你的查詢:
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'];
}
刪除GROUP BY之前的逗號和查詢將工作。 –
此查詢將只給出每天匹配的第一行。這可以通過'GROUP_CONCAT()'來實現,但結果不容易重複使用。爲什麼你不能使用PHP? –
你應該通過PHP來完成。大多數僅MySQL解決方案將使用「GROUP_CONCAT()」函數,該函數將列的大小限制爲1KB。如果你有幾十條這樣的查詢不會給你一個完整的圖片。 –