繁体   English   中英

MySQL-联接2个查询

[英]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

你可以做SQL小提琴吗?

USE DISTINCT 

stackoverflow.com/questions/11704012/mysql-distinct-join

尝试这个

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM