Mysql - 加入2个限制查询

时间:2014-09-03 10:28:07

标签: php mysql sql join

我不太熟悉在查询中使用'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

6 个答案:

答案 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)

你能让sql小提琴吗?

USE DISTINCT 

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

答案 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;