我正在尝试显示两个表中的项目的新闻源。
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。
下面的$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
提前多多感谢!
答案 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语法,但是......