truy vấn trên của bạn không làm việc, trừ rằng khi bạn GROUP BY
một cột, bạn phải bằng cách nào đó tổng hợp tất cả những người khác.
Ví dụ: GROUP BY Day
trả về một bản ghi cho mỗi ngày. Nếu có nhiều bản ghi được nhập cho mỗi ngày và bạn đang yêu cầu id
, title
, category
, v.v., làm cách nào để MySQL biết được đa số nào để hiển thị cho bạn vì nó chỉ hiển thị cho bạn một hàng? (Nó thường hiển thị hàng "đầu tiên" cho mỗi ngày khi chúng xuất hiện trong "SELECT * FROM mytable"
, nhưng bạn không nên dựa vào điều này).
Giải pháp là bạn bằng cách nào đó tổng hợp tất cả các thuộc tính riêng lẻ đó như id
thành một chuỗi cho mỗi nhóm. Bạn có thể sử dụng GROUP_CONCAT
cho điều này như gợi ý @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
này sẽ cung cấp cho bạn ví dụ .:
1,4 Story 1 Title, Story 2 Title <Day1> Funny,Sad ....
Tức là các id, tiêu đề, danh mục, nguồn, loại và nội dung sẽ biến thành một chuỗi được phân cách bằng dấu phẩy mỗi Ngày.
Tuy nhiên có vẻ như điều này không hoàn toàn phù hợp với mục đích của bạn (có một chuỗi với nội dung của tất cả các bài viết vào ngày đó dường như vô nghĩa).
Tôi nghĩ rằng bạn nên thực hiện truy vấn của bạn:
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
(Chú ý tôi đã thay đổi DAYOFMONTH
của bạn để DAYOFWEEK
vì nó có vẻ phù hợp với câu hỏi ban đầu của bạn tốt hơn.)
Sự thay đổi là không có nhóm - chỉ cần sắp xếp theo ngày.
Vì đầu ra của bạn được sắp xếp theo ngày, tên ngày cũng sẽ theo thứ tự.
Bạn có thể làm một cái gì đó như thế này trong php của bạn sau đó:
$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'];
}
xóa dấu phẩy trước GROUP BY và truy vấn sẽ hoạt động. –
Truy vấn này sẽ chỉ cung cấp hàng đầu tiên phù hợp cho mỗi ngày. Nó có thể thực hiện được với 'GROUP_CONCAT()' nhưng kết quả không dễ sử dụng lại. Tại sao bạn không thể sử dụng php? –
Bạn nên làm điều đó thông qua PHP. Hầu hết các giải pháp chỉ có MySQL sẽ sử dụng hàm 'GROUP_CONCAT()' để giới hạn kích thước của cột thành 1KB. Nếu bạn có một vài chục bài viết truy vấn như vậy sẽ không cung cấp cho bạn bức tranh hoàn chỉnh. –