2017-03-10 38 views
0

我遇到了SQL问题。我目前正在开发一个网站,该网站内置了一个吉他调音器。用户被允许创建乐器并存储关于他们的调音的信息。问题在于,如果用户创建了新的乐器,那么会有表格向他们展示他们在网站上创建的乐器。但是,只有经过调谐记录后,乐器才会出现。当max()不存在时,将MYSQL中的max()设置为null

这是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当存在对仪器没有记录,因此该表将打印用仪器创建仪器时连接到它没有最新纪录。

+0

是什么,你得到目前 –

+1

结果'选择b.Username,a.Name,a.Type,a.ID, MAX(c.Date)作为lasttuned FROM文书 用户加入b。在一.Users_ID = b.ID left join instrumenttuner c ON c.Instrument_ID = a.ID group by a.ID order by b.ID asc,a.ID asc;' –

+0

我目前只收到乐器的记录如果有意义的话,他们已经有日期值了。 –

回答

0

从不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列。在这种情况下,这是可以的,因为您正在按表的主键进行聚合,并使用该表中的其他列或主键唯一的列。