2017-03-10 87 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列。在這種情況下,這是可以的,因爲您正在按表的主鍵進行聚合,並使用該表中的其他列或主鍵唯一的列。