![](/img/trans.png)
[英]How to optimize MySQL "Order By Limit 1" in queries that join multiple tables?
[英]Mysql - join 2 queries with limit
我对在查询中使用“联接”不是很熟悉。 我确实尝试自己解决此问题,但这似乎太难了。
我有2张桌子:
Table 'users':
+-----------------+-----------------+
| member | online |
+-----------------+-----------------+
| mahran | 1 |
| peter | 1 |
| Jen | 1 |
| Steve | 0 |
+-----------------+-----------------+
Table 'tickets'
+-----------------+----------------+----------------+
| name | category | time |
+-----------------+----------------+----------------+
| mahran | silver | 1 |
| peter | blue | 1 |
| mahran | blue | 2 |
| peter | red | 3 |
| peter | green | 2 |
| Jen | silver | 1 |
+-----------------+----------------+----------------+
雪兰莪:
我需要每个在线(users.online)的成员(users.member)。 接下来的事情是获取具有最高时间(可能是ORDER BY time DESC LIMIT 1)的每个成员的类别(user.member = tickets.name)。
因此,例如:彼得在线。 彼得斯的最高时间是3在类别=红色的位置。 因此,我希望彼得将其类别显示为“红色”。 Mahran会出现蓝色。 仁会得到银。 而史蒂夫将被排除在外,因为他不在网上。
我希望这是清楚的。 通常,我知道查询的外观,但是没有机会将它们合并在一起。
需要合并的内容:
SELECT member FROM users WHERE online = 1;
|
v for each member
SELECT category FROM tickets WHERE name=users.member ORDER BY time DESC.
那么,有什么想法如何解决这个问题?
这是一个带有无效查询的小提琴: 单击
您可以使用相关的子查询轻松地做到这一点:
select u.member,
(select t.category
from tickets t
where t.name = u.member
order by t.time desc
limit 1
) as MostRecentCategory
from users u
where u.online = 1;
这可以利用以下索引: users(online, member)
和ticket(member, time, category)
。
这是您要查找的查询:
SELECT U.member
,T.category
FROM users U
INNER JOIN tickets T ON T.name = U.member
INNER JOIN (SELECT T2.name
,MAX(T2.time) AS [maxTime]
FROM tickets T2
GROUP BY T2.name) AS M ON M.name = T.name
AND M.maxTime = T.time
WHERE U.online = 1
使用[name]来连接两个表不是一个好习惯,最好使用键来代替。 但是我的询问只是在这里,以帮助您了解关节的过程。
希望这会帮助你。
如果我正确理解你
SELECT DISTINCT users.member, tickets.category FROM tickets JOIN users ON users.member = tickets.name WHERE users.online = 1 ORDER BY tickets.time DESC
尝试这个
SELECT DISTINCT User.member,Ticket.category FROM users AS USER
INNER JOIN tickets AS Ticket ON (User.member = Ticket.name)
WHERE User.online = 1;
抱歉,彼得似乎是红色的,现在是3点。不是吗?
根据表定义,不能保证每个用户只有一个结果。 例如,如果peter在两个类别中具有时间3,则可以根据SQL排序方法获得一个不同的类别。
可以肯定的是,ticket.Category和tickets.time必须使用唯一键(两者同时使用,而不是每个字段的unike键)
假设查询可以是这样。
select t2.name, t2.category
from
tickets t2
INNER JOIN (Select
u.member, max(time)
from users u, tickets t
where
u.member = t.name
and u.online = 1
group by u.member
) as usermaxtime on t2.name = usermaxtime.member;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.