MySql在JOIN查询中按日期排序

时间:2013-12-23 13:53:05

标签: php mysql sql codeigniter join

我正在尝试显示两个表中的项目的新闻源。

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

Shared_News实际上是News表中的ID。现在的情景......

我的新闻Feed必须显示新闻表中的项目以及Shared_News项目。 Shared_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

存储在Share表中的数据如下

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

提前多多感谢!

3 个答案:

答案 0 :(得分:1)

您正在寻找每条新闻的最后分享日期(如果有的话)。所以找到这些,加入新闻,然后按分享日期订购(如果可用),否则发布日期:

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;

顺便说一句:不要将列称为“date”,因为这是一个SQL词。

答案 1 :(得分:1)

这就是我最终要做的事情。我使用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博士指出了接近它的方法。

答案 2 :(得分:0)

尝试此查询:

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语法,但是......