[英]PHP/MySQL - Need assistance writing a SQL Query
我有一个武术网站,在一张桌子上有用户,而在另一张桌子上有用户。 以下是一些示例表/数据来帮助描述我的问题:
Users
表:
+---------------------+
| Users |
+---------------------+
| userid | name |
+---------------------+
| 1 | Fred Smith |
+---------------------+
Belts
表:
+------------------------------------------+
| id | userid | belt_colour | awarded_date |
+------------------------------------------+
| 1 | 1 | blue | 2007-01-01 |
+------------------------------------------+
| 2 | 1 | purple | 2008-01-01 |
+------------------------------------------+
| 2 | 1 | brown | 2009-01-01 |
+------------------------------------------+
我的问题是:当您单击棕色时,要查看所有棕色皮带,我希望您看到弗雷德。 我不希望Fred出现在蓝色和紫色皮带的列表中(此刻正在发生这种情况)。
我正在努力提出这样的查询:
向我显示所有用户,其中belt = $ belt,但前提是他们没有更高皮带的条目。
另一个例子:我是紫色的,但我出现在蓝色列表中,因为我的蓝色皮带的详细信息也在皮带表中:-(
任何协助,不胜感激!
假设更高的皮带意味着更高的dashed_date,一个选择是获取每个用户的maxed_date MAX
并重新加入皮带表:
SELECT u.userId, u.name
FROM Users u
JOIN (
SELECT userId, MAX(awarded_date) max_awarded_date
FROM Belts
GROUP BY userId
) maxb ON u.userId = maxb.userId
JOIN Belts b ON b.userId = maxb.userId
AND b.awarded_date = maxb.max_awarded_date
WHERE b.belt_colour = 'brown'
按_awarded_date_降序排序。 并将结果限制为1 。
因为每个腰带都被一个接一个地授予,所以您要展示最近的那个。 因此,您的查询将如下所示:
select * from Users u, Belts b where u.userid = b.userid order by awarded_date limit 1;
希望这可以帮助。
让我们将这个问题一分为二:
所以,让我们开始吧。
步骤1.a. 每个用户的最新皮带记录
select b.*
from
belts as b
inner join (
select max(id) as maxId from belts group by userId
) as a on b.id = a.maxId
我假设id
字段总是递增的。
步骤1.b. 将步骤(1.a.)与用户的数据结合起来
select u.*, b.*
from
users as u
inner join (
select b.*
from
belts as b
inner join (
select max(id) as maxId from belts group by userId
) as a on b.id = a.maxId
) as b on u.userId = b.userId
步骤2.选择所有具有给定腰带的用户
select u.*, b.*
from
users as u
inner join (
select b.*
from
belts as b
inner join (
select max(id) as maxId from belts group by userId
) as a on b.id = a.maxId
) as b on u.userId = b.userId
where
b.belt_colour = 'brown'
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.