2014-11-02 49 views
0

我有三個表,libraryitems,副本和貸款。MySQL的子選擇需要

A libraryitem hasMany copies,副本hasMany貸款。

我試圖獲取只有一個副本最新貸款條目;以下查詢返回給定副本的全部貸款。

SELECT 
libraryitems.title, 
copies.id, 
copies.qruuid, 
loans.id AS loanid, 
loans.status, 
loans.byname, 
loans.byemail, 
loans.createdAt 
FROM copies 
INNER JOIN libraryitems ON copies.libraryitemid = libraryitems.id AND libraryitems.deletedAt IS NULL 
LEFT OUTER JOIN loans ON copies.id = loans.copyid 
WHERE copies.libraryitemid = 1 
ORDER BY copies.id ASC, loans.createdAt DESC 

我知道在這裏需要一些子選擇的描述,但努力獲得正確的語法。我怎樣才能爲每個不同的副本返回最新的,即MAX(loans.createdAt)行?只需使用group by copy.id返回最早的條目,而不是最新的條目。

圖片下面的例子: enter image description here

+1

(如穆赫辛已經證明)子查詢是不嚴格necesssary - 但它往往會更快! – Strawberry 2014-11-02 12:43:14

回答

1
子查詢

,獲得最大的創建時間的貸款,即最近一次入境,並與貸款結合回去取其他細節。

SELECT 
T.title, 
T.id, 
T.qruuid, 
loans.id AS loanid, 
loans.status, 
loans.byname, 
loans.byemail, 
loans.createdAt 
FROM 
(
    SELECT C.id, C.qruuid, L.title, MAX(LN.createdAt) as maxCreatedTime 
    FROM Copies C 
    INNER JOIN libraryitems L ON C.libraryitemid = L.id 
    AND L.deletedAt IS NULL 
    LEFT OUTER JOIN loans LN ON C.id = LN.copyid 
    GROUP BY C.id, C.qruuid, L.title) T 
JOIN loans ON T.id = loans.copyid 
AND T.maxCreatedTime = loans.createdAt 
+0

我得到[Err] 1146 - 表'qweylibrary.ln'與此不存在? – Neokoenig 2014-11-02 13:00:54

+0

@Neokoenig,別名在選擇一列時錯過了,你現在可以試試嗎? – radar 2014-11-02 13:04:29

+0

完美!非常感謝 - 正在做我的頭:) – Neokoenig 2014-11-02 13:07:39

1

自左加入貸款表會給你一份最新的貸款,你可能join查詢到其他表來獲取所需的輸出。

select * from loans A 
left outer join loans B 
on A.copyid = B.copyid and A.createdAt < B.createdAt 
where B.createdAt is null; 
+0

Thankyou,這也是v得心應手! – Neokoenig 2014-11-02 13:42:24

0

這是您的查詢,只需一個簡單的修改 - 表別名,使其更清晰。

SELECT li.title, c.id, c.qruuid, 
     l.id AS loanid, l.status, l.byname, l.byemail, l.createdAt 
FROM copies c INNER JOIN 
    libraryitems li 
    ON c.libraryitemid = li.id AND 
     li.deletedAt IS NULL LEFT JOIN 
    loans l 
    ON c.id = l.copyid 
WHERE c.libraryitemid = 1 
ORDER BY c.id ASC, l.createdAt DESC ; 

將此作爲開始,讓我們考慮一下你需要什麼。您需要每個c.id的最新日期爲createdAt的負載。您可以使用子查詢得到這個信息:現在

select l.copyid, max(createdAt) 
from loans 
group by l.copyId 

,你只需要回來參加這個信息:

SELECT li.title, c.id, c.qruuid, 
     l.id AS loanid, l.status, l.byname, l.byemail, l.createdAt 
FROM copies c INNER JOIN 
    libraryitems li 
    ON c.libraryitemid = li.id AND 
     li.deletedAt IS NULL LEFT JOIN 
    loans l 
    ON c.id = l.copyid LEFT JOIN 
    (SELECT l.copyid, max(l.createdAt) as maxca 
     FROM loans 
     GROUP BY l.copyid 
    ) lmax 
    ON l.copyId = lmax.copyId and l.createdAt = lmax.maxca 
WHERE c.libraryitemid = 1 
ORDER BY c.id ASC, l.createdAt DESC ; 

這應該給你最新的記錄。而且,使用left join應該保留所有副本,即使那些從來沒有出租過的副本。