我遇到了 SQL 问题。我目前正在开发一个网站,该网站内置了一个吉他调音器。用户可以创建乐器并存储有关其调音的信息。问题是,如果用户创建新的工具,网站上会有一个表格向他们显示他们创建的工具。然而,只有在记录为调谐后,该乐器才会出现。
这是 SQL 存储过程的问题。我将表中的调音日期设置为最大,这意味着如果乐器尚未调音,它将不会显示。 日期在 MYSQL 中设置为 DATETIME
存储过程如下所示。
CREATE DEFINER=`root`@`localhost` PROCEDURE `selectallinstruments`()
BEGIN
SELECT b.Username, a.Name, a.Type, a.ID, max(c.Date) as lasttuned
FROM instruments a, Users b, instrumenttuner c
WHERE a.Users_ID = b.ID and c.Instrument_ID = a.ID
group by a.ID order by b.ID asc, a.ID asc;
END
当仪器没有记录时,有没有办法使lasttuned在这种情况下等于null,以便表在创建仪器时打印没有附加日期记录的仪器。
最佳答案
切勿在FROM
子句中使用逗号。 始终使用明确、正确的JOIN
语法。
您想要的是LEFT JOIN
:
select u.Username, i.Name, i.Type, i.ID, max(c.Date) as lasttuned
from instruments i left join
users u
on i.users_ID = u.ID left join
instrumenttuner it
on it.Instrument_ID = i.ID
group by i.ID
order by u.ID asc, i.ID asc;
一般来说,您要小心 SELECT
中的列不在 GROUP BY
中。在这种情况下,这是可以的,因为您是按表的主键聚合并使用该表中的其他列或主键的唯一列。
关于mysql - 当不存在 max() 时,在 MYSQL 中将 max() 设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42718509/