2014-11-02 2 views
0

У меня есть три таблицы, библиотечные предметы, копии и кредиты.mySQL Sub Выберите необходимый

libraryitem hasMany копии, а копия 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) строку для каждой отдельной копии? Просто использование группы по экземплярам copy.id возвращает самую раннюю, а не последнюю запись.

пример изображение ниже: enter image description here

+1

(Как продемонстрировал Мохсен) Подзапрос не является абсолютно необходимым - но он, как правило, быстрее! – Strawberry

ответ

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

+0

@Neokoenig, имя псевдонима было пропущено при выборе для одного столбца, можете ли вы попробовать сейчас? – radar

+0

Отлично! Огромное спасибо, я так и делал. :) – Neokoenig

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

Спасибо, это тоже удобно! – Neokoenig

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 ; 

С этим в качестве начала давайте подумаем о том, что вам нужно. Вы хотите, чтобы нагрузка была установлена ​​с последней датой createdAt для каждого c.id. Вы можете получить эту информацию с помощью подзапроса:

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 должно содержать все копии, даже те, которые никогда не были наклонены.