[英]MySql Sort by Date in JOIN Query
我試圖顯示來自兩個表的項目的新聞提要。
Table 1: News - Id / Title / Date
Table 2: Shared_News - Id / News_Id / Date
News_Id
的Shared_News
實際上是News
表中的ID。 現在場景...
我的新聞提要必須顯示“新聞”表中的項目以及Shared_News項目。 根據共享的日期,Shared_News項目將與News項目合並。
讓我們舉一個例子,我們從News
表中按日期顯示Id的2,4,6,8,如下所示
8
6
4
2
現在,讓支持者在文章8發布后的某個日期與用戶共享News
項目5,並將其輸入到Shared_News
表中。 我希望顯示以下順序
5
8
6
4
2
現在,如果在發布第4項之后共享了第1項,則訂單應如下
5
8
6
1
4
2
有人可以幫我,因為我正在做的左聯接不起作用。 以下是我的代碼/我正在使用Codeigniter Framework。
以下$ stories_finalized是新聞ID和共享新聞ID的合並列表。
$select = array(
'users.name',
'story.id as story_id',
'story.date',
'story.title',
'story.user_id',
'share.date as shared_story_date'
);
$where = array('story.show' => 1);
$this->db
->select($select)
->where_in('story.id', $stories_finalized)
->join('users', 'users.id = story.user_id')
->join('share', 'share.story_id = story.id', 'LEFT')
->where($where)
->order_by('share.date, story.date', 'DESC')
->limit(STORY_QUERY_LIMIT, $from);
故事表中存儲的數據如下
59 | This is an example story | 2013-09-20
45 | This is the title of the shared story | 2013-08-12
共享表中存儲的數據如下
1 | 45 | 2013-12-24
最后,我希望數據如下
45 | This is the title of the shared story | 2013-08-12
59 | This is an example story | 2013-09-20
在此先多謝!
您正在尋找每個新聞的最后共享日期(如果有)。 因此,找到它們,將它們與新聞一起加入,然后按共享日期(如果有)排序,否則按發布日期排序:
select news.title, news.date_published, last_shared.share_date
from news
left outer join
(
select news_id, max(date_shared) as share_date
from shared_news
group by news_id
) last_shared on (last_shared.news_id = news.id)
order by coalesce(last_shared.share_date, news.date_published) desc;
順便說一句:不要將列稱為“日期”,因為這是一個SQL詞。
這就是我最終要做的。 我使用Codeigniter。
$this->db->select('users.name, story.date, story.title, IFNULL(share.date, story.date) as sort_date', FALSE)
->where_in('story.id', $stories_finalized)
->where(array(
'story.show' => 1
))
->join('users', 'users.id = story.user_id', 'INNER')
->join('share', 'share.story_id = story.id', 'LEFT OUTER')
->group_by('story.id')
->order_by('sort_date', 'DESC');
感謝Thorsten指出重復的story_id,並感謝Fu Manchu博士指出接近的方法。
試試這個查詢:
SELECT users.*, story.*, IFNULL(share.`date`, story.`date`) AS sort_date FROM
users INNER JOIN story ON users.id = story.user_id
LEFT JOIN share ON share.story_id = story.id
WHERE story.id IN (....)
ORDER BY sort_date DESC
我不禁將其轉換為codeigniter語法...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.