我有一个武术网站,我有一个桌子上的用户和他们在另一个表中获得的腰带。以下是一些示例表/数据,以帮助描述我的问题:
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 |
+------------------------------------------+
我的问题是:当你点击棕色时,要查看所有棕色腰带,我希望你看到弗雷德。我不希望弗雷德出现在蓝色和紫色腰带的列表中(这是目前正在发生的事情)。
我正在努力想出一个像这样的查询:
告诉我所有使用腰带= $腰带的用户,但前提是他们没有更高腰带的条目。
另一个例子:我是紫色但我出现在蓝色列表中,因为我的蓝带的细节也在腰带表中: - (
非常感谢任何帮助!
答案 0 :(得分:3)
假设更高的腰带意味着更高的award_date,一个选项是获得每个用户的MAX
award_date并加入腰带表:
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'
答案 1 :(得分:1)
按_awarded_date_降序排序。 将1 限制为结果。
由于每个腰带都是一个接一个地颁发,最近的,是你要展示的。所以,你的查询将是这样的:
select * from Users u, Belts b where u.userid = b.userid order by awarded_date limit 1;
希望这有帮助。
答案 2 :(得分:0)
让我们将这个问题分成两部分:
所以,让我们开始。
步骤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'
希望这有帮助