您好我有这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从表活动的最后一行中选择。
希望你了解我 谢谢答案 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