选择 t1 中的所有行在 id 上加入 t2 和 select t2 中的最低值,如果没有则为 null
Selecting all rows from t1 join t2 on id and select the lowest value from t2 or null if not any
我有两个 table,一个保存一些类别,另一个保存玩家的记录,如下所示:
Categories Times
id Name id UserId MapId CategoryId Time
1 cat1 1 1 1 1 1500
2 cat2 2 3 1 2 3000
3 cat3 3 13 1 3 2500
4 cat4 4 12 1 4 1500
5 cat5 5 11 1 4 1000
我想select所有类别(id,name)和每个类别上的最低时间。
如果该类别没有记录,则应显示 NULL 或 0。
这将是预期的结果:
Result
id Name Time
1 cat1 1500
2 cat2 3000
3 cat3 2500
4 cat4 1000
5 cat5 0
我正在使用以下查询,但它仅 selects 已经在 Times 中有记录的类别。
例如,如果我使用以下查询,它将不会 select 'cat5' 因为它在 table 次中没有任何记录。
select t2.id, t2.Name, min(t1.Time) as Time
from Times t1
join Categories t2 on t2.id = t1.CategoryId
where t1.MapId = %MAPID%
group by t2.id
我认为您可能只需要进行右连接(因为您希望列出第二个 table 中的所有行 -- 类别)。将第 3 行更改为:
,看看您是否获得了想要的结果
right join Categories t2 on t2.id = t1.CategoryId
在这种情况下,我建议您从 table“类别”开始查询,因为您的重点是来自此 table 的数据。所以你可以写一个左连接。此外,我认为将空值替换为零是个好主意,因此您的查询将例如找到负时间作为最低时间,如果最低时间是空值,则 return 0 。
总的来说,这可能是您的目标:
SELECT c.id, c.name, MIN(COALESCE(t.time,0)) AS time
FROM categories c LEFT JOIN times t ON c.id = t.categoryid
GROUP BY c.id, c.name;
根据您的示例数据,这是一个工作示例:db<>fiddle
可能还有其他选择可以实现您的目标,您可以尝试一下。
我有两个 table,一个保存一些类别,另一个保存玩家的记录,如下所示:
Categories Times
id Name id UserId MapId CategoryId Time
1 cat1 1 1 1 1 1500
2 cat2 2 3 1 2 3000
3 cat3 3 13 1 3 2500
4 cat4 4 12 1 4 1500
5 cat5 5 11 1 4 1000
我想select所有类别(id,name)和每个类别上的最低时间。 如果该类别没有记录,则应显示 NULL 或 0。 这将是预期的结果:
Result
id Name Time
1 cat1 1500
2 cat2 3000
3 cat3 2500
4 cat4 1000
5 cat5 0
我正在使用以下查询,但它仅 selects 已经在 Times 中有记录的类别。 例如,如果我使用以下查询,它将不会 select 'cat5' 因为它在 table 次中没有任何记录。
select t2.id, t2.Name, min(t1.Time) as Time
from Times t1
join Categories t2 on t2.id = t1.CategoryId
where t1.MapId = %MAPID%
group by t2.id
我认为您可能只需要进行右连接(因为您希望列出第二个 table 中的所有行 -- 类别)。将第 3 行更改为:
,看看您是否获得了想要的结果right join Categories t2 on t2.id = t1.CategoryId
在这种情况下,我建议您从 table“类别”开始查询,因为您的重点是来自此 table 的数据。所以你可以写一个左连接。此外,我认为将空值替换为零是个好主意,因此您的查询将例如找到负时间作为最低时间,如果最低时间是空值,则 return 0 。 总的来说,这可能是您的目标:
SELECT c.id, c.name, MIN(COALESCE(t.time,0)) AS time
FROM categories c LEFT JOIN times t ON c.id = t.categoryid
GROUP BY c.id, c.name;
根据您的示例数据,这是一个工作示例:db<>fiddle
可能还有其他选择可以实现您的目标,您可以尝试一下。