我不太熟悉在查询中使用'join'。我真的试过自己解决这个问题,但似乎太难了。
我有两张桌子:
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 |
+-----------------+----------------+----------------+
chellange:
我需要在线的每个成员(users.member)(users.online)。接下来是为每个成员(user.member = tickets.name)获取具有最高时间的类别(可能是ORDER BY时间DESC LIMIT 1)。
所以,例如: 彼得在线。彼得斯在类别=红色的位置最高时间为3。所以我希望彼得以他的类别“红色”出现在结果中。马赫兰会出现蓝色。仁会得银子。史蒂夫会被遗弃,因为他不在线。
我希望这很清楚。一般来说,我知道查询会是什么样子,但我没有机会将它们合并在一起。
需要合并的内容:
SELECT member FROM users WHERE online = 1;
|
v for each member
SELECT category FROM tickets WHERE name=users.member ORDER BY time DESC.
那么,任何想法如何解决这个问题?
以下是一个无效查询的小提琴:Click
答案 0 :(得分:2)
您可以使用相关子查询轻松完成此操作:
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)
。
答案 1 :(得分:1)
以下是您要查找的查询:
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]加入这两个表并不是一个好习惯,而是使用密钥更好。但我的问题只是帮助您了解关节的过程。
希望这会对你有所帮助。
答案 2 :(得分:0)
如果我理解正确
SELECT DISTINCT users.member, tickets.category FROM tickets JOIN users ON users.member = tickets.name WHERE users.online = 1 ORDER BY tickets.time DESC
答案 3 :(得分:0)
答案 4 :(得分:0)
试试这个
SELECT DISTINCT User.member,Ticket.category FROM users AS USER
INNER JOIN tickets AS Ticket ON (User.member = Ticket.name)
WHERE User.online = 1;
答案 5 :(得分:-1)
很抱歉,但彼得似乎是红色的,现在是3岁。不是吗?
根据表定义,不保证每个用户只有一个结果。 例如,如果peter在两个类别中有时间3,则可以根据SQL排序方法获得一个不同的类别。
可以肯定的是,tickets.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;