2014-03-28 55 views
0
地方

你好,我有这4代表与结构MySQL的选择从多个表+最后一排从别的

Table: Users [ id, username, password, bouquet_id ] 
Table: Bouquets [ id, bouquet_name, stream_ids = serialized array ] 
Table: Streams [ id, channel_name ] 
Table: activity [ id, user_id, stream_id ] 

我想选择所有用户,但与他们的信息以及从其他表+最后一排从每个用户

例如以下查询表活性:

SELECT t1.*,t2.`bouquet_name` 
FROM `users` t1,`bouquets` t2 
WHERE t1.`bouquet_id ` = t2.`id` 
ORDER BY t1.id DESC 

从第一表2注意到数据和分配bouquet_id其花束名称。 现在我想查询有从活动表中的最后一行,它的流名称[基于的stream_id]

下面的查询不工作我想[PER USER]

SELECT t1.channel_name 
FROM `streams` t1,`activity` t2 
WHERE t2.user_id = **'%d'** AND t1.id = t2.stream_id 
ORDER BY t2.id DESC 
LIMIT 1 

但它是一种因为对于表中的每个用户“用户”,我运行2个查询。 我想将上面的2个查询作为一个嵌入在一起,这样我就可以从前两个表中选择数据,但根据user_id从表活动的最后一行中选择数据。

希望你能理解我 谢谢

回答

1

你不应该依赖于"last row" = "row with greatest id"。由于MySQL提供了设置主 - 主复制的可能性,因此可以按照或多或少的任意顺序分配auto_increment值,但这种假设并非总是如此。额外的timestamp列会更好。

您可以选择每用户最近的活动,例如:

SELECT user_id, MAX(id) FROM activity GROUP BY user_id 

然后你必须加入这个到你的查询,并在基本activity表连接以获取你真正想要的数据。您可能需要更换您的加入与左边的连接,所以你总是会检索所有用户,无论是否有在bouquetsactivity存在行:

SELECT t1.*, t2.`bouquet_name`, activity.* 
FROM `users` t1 
LEFT JOIN `bouquets` t2 
ON t1.`bouquet_id ` = t2.`id` 
LEFT JOIN (
    SELECT user_id, MAX(id) AS maxid FROM activity GROUP BY user_id 
) mostrecent 
ON t1.user_id = mostrecent.user_id 
LEFT JOIN activity 
ON t1.user_id = activity.user_id AND activity.id = mostrecent.maxid 
ORDER BY t1.id DESC 

然后你就可以在数据流加入太像

SELECT t1.*, t2.`bouquet_name`, activity.stream_id, streams.channel_name 
FROM `users` t1 
LEFT JOIN `bouquets` t2 
ON t1.`bouquet_id ` = t2.`id` 
LEFT JOIN (
    SELECT user_id, MAX(id) AS maxid FROM activity GROUP BY user_id 
) mostrecent 
ON t1.user_id = mostrecent.user_id 
LEFT JOIN activity 
ON t1.user_id = activity.user_id AND activity.id = mostrecent.maxid 
LEFT JOIN streams 
ON activity.stream_id = streams.id 
ORDER BY t1.id DESC 
+1

谢谢你的工作。 – user3393046