Próbuję wybrać 2 kolumny z podzapytania w następującym zapytaniu, ale nie mogę tego zrobić. Próbowałem utworzyć tabelę aliasów, ale nadal nie mogłem ich zdobyć.
SELECT
DISTINCT petid,
userid,
(SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate,
(SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM
pet LEFT JOIN comments ON pet.id = comments.petid
WHERE
userid='ABC' AND
deviceID!='ABC' AND
comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH);
Zasadniczo próbuję uzyskać znak lastComDate
& lastPosterID
z tego samego wiersza - wiersza, który jest najnowszy w komentarzach dla konkretnego zwierzaka. Proszę zasugerować, jak mogę je uzyskać w efektywny sposób.
Powyższe zapytanie działa, ale wydaje się przesadne, ponieważ ten sam wiersz jest pobierany dwukrotnie. Co więcej, ORDER BY
klauzula jest znacznie wolniejsza niż funkcja agregująca - co znalazłem podczas profilowania zapytania. Docenione zostanie więc rozwiązanie pozwalające uniknąć sortowania.
mysql
performance
select
subquery
BufferStack
źródło
źródło
deviceID
Jest odpets
stołu - co oznacza, że po prostu nie dostać mi zwierzęta, które są przekazywane przez „abc” sam.Odpowiedzi:
Możesz również wyciągnąć podzapytanie do tabeli tymczasowej, jeśli gdzieś po drodze wpłynie na wydajność.
źródło
NULL
obalastComDate
ilastPosterId
wszystkie rekordy.Biorąc pod uwagę, że twoje stoły wyglądają tak:
To zapytanie powinno załatwić sprawę:
źródło