选择 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

可能还有其他选择可以实现您的目标,您可以尝试一下。