MySQL从多个表中选择+从其他地方选择最后一行

时间:2014-03-28 18:25:05

标签: mysql sql select

您好我有这4个结构

的表
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

从前两个表中获取数据并将bouquet_id分配给其花束名称。 现在我想查询活动表中的最后一行ROW它的流名称[基于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 个答案:

答案 0 :(得分:1)

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

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

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

然后,您必须将其加入到查询中并加入基本activity表以检索您实际需要的数据。您可能还希望使用左连接替换连接,因此无论bouquets还是activity中是否存在行,您都将始终检索所有用户:

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