2013-03-31 63 views
0

這裏是我的選擇查詢語句:爲使MySQL選擇查詢用戶和追隨者的帖子

select distinct posts.*, user_status.status_content 
from posts left join user_status on 
user_status.user_id = posts.user_id 
where posts.user_id 
= $userid or posts.user_id in 
(select follower from follower where follower.user_id = $userid) order by posts.created_at desc; 

我選擇查詢語句工作正常,但輸出是不是我真正想要。 我想要的是從當前用戶和他的追隨者中選擇所有帖子,並且每個帖子的用戶名是他們最新的status content,狀態由用戶更新,我只想從表中選擇最新的狀態內容,所以我怎麼做?

職位表:

+------------+------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+------------+------------+------+-----+---------+----------------+ 
| id   | bigint(20) | NO | PRI | NULL | auto_increment | 
| user_id | bigint(20) | NO | MUL | NULL |    | 
| content | text  | NO |  | NULL |    | 
| created_at | datetime | YES |  | NULL |    | 
+------------+------------+------+-----+---------+----------------+ 

user_status表:

+----------------+--------------+------+-----+-------------------+-------+ 
| Field   | Type   | Null | Key | Default   | Extra | 
+----------------+--------------+------+-----+-------------------+-------+ 
| user_id  | bigint(20) | NO | MUL | NULL    |  | 
| status_content | varchar(225) | YES |  | Hello World  |  | 
| created_date | timestamp | NO |  | CURRENT_TIMESTAMP |  | 
+----------------+--------------+------+-----+-------------------+-------+ 

用戶可以更新thier狀態,所以會出現在user_status表中多條記錄。

我的選擇查詢可能會喜歡這樣的輸出:

I feel like s**t today!!!! 
Hello world 
2013-03-28 22:34:14 
----------------------------- 
I don't feel very good today 
Hello world 
2013-03-28 22:34:14 

我想要的,假設I feel like s**t today是最新的狀態,所以它應該輸出,如:

I feel like s**t today!!!! 
Hello world 
2013-03-28 22:34:14 

回答

1

下面是一個可以工作的查詢,無論您正在查看的用戶ID的數量如何。它會計算最近狀態更改的日期,並將其用於加入:

select distinct posts.*, user_status.status_content 
from posts left join 
    user_status 
    on user_status.user_id = posts.user_id left join 
    (select user_id, max(created_at) as maxdate 
     from user_status 
    ) usmax 
    on usmax.user_id = user_status.user_id and usmax.maxdate = user_status.create_at 
where posts.user_id = $userid or 
     posts.user_id in (select follower from follower where follower.user_id = $userid) 
order by posts.created_at desc; 
2

加入這一條款 - LIMIT 0,1到你的SQL語句。這基本上限制了結果的數量最多一個(這將是最新的帖子)。根據MySQL reference manual for SELECT,LIMIT子句定義爲:

LIMIT子句可用於約束SELECT語句返回的行數。

我也想象你需要一個額外的order by子句 - 例如:ORDER BY posts.created_at DESC

+0

只有當他想要獲得特定用戶時,此功能纔有效。如果他想要獲得所有用戶的最新狀態,該怎麼辦?然後添加絕對不會工作。 –

+0

@JW是的,獲取所有用戶的最新狀態,以及所有帖子,比如'twitter'!但'用戶名'被'狀態內容'取代。 – towry