簡體   English   中英

MySql的JOIN查詢按日期排序

[英]MySql Sort by Date in JOIN Query

我試圖顯示來自兩個表的項目的新聞提要。

Table 1: News - Id / Title / Date
Table 2: Shared_News - Id / News_Id / Date

News_IdShared_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM