J'essaie de sélectionner 2 colonnes de la sous-requête dans la requête suivante, mais je ne peux pas le faire. J'ai essayé de créer une table d'alias, mais je n'ai toujours pas pu les obtenir.
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);
Fondamentalement, j'essaye d'obtenir le lastComDate
& lastPosterID
de la même ligne - la ligne qui est la dernière dans les commentaires pour l'animal spécifique. Veuillez suggérer comment puis-je les obtenir de manière efficace.
La requête ci-dessus fonctionne, mais semble excessive car la même ligne est récupérée deux fois. De plus, la clause ORDER BY
Est beaucoup plus lente que la fonction d'agrégation - comme je l'ai trouvé lors du profilage de la requête. Une solution évitant le tri serait donc appréciée.
SELECT DISTINCT petid, userid, lastComDate, lastPosterId
FROM
pet
LEFT JOIN comments ON pet.id = comments.petid
LEFT JOIN (
SELECT MAX(comDate), userid, petid FROM comments GROUP BY userid
) a ON a.petid = pet.id
WHERE
userid='ABC'
AND deviceID!='ABC'
AND comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
;
Vous pouvez également extraire votre sous-requête dans une table temporaire si les performances sont affectées quelque part en cours de route.
Étant donné que vos tables ressemblent à ceci:
create table pet (id int, userid int, deviceid int);
create table comments (id int, petid int, comdate date);
Cette requête devrait faire l'affaire:
SELECT
p.id,
p.userid,
(SELECT MAX(comDate)
FROM comments
WHERE petid = p.id
AND comDate >= DATE_SUB(
CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
) AS lastComDate,
(SELECT userid
FROM comments
WHERE petid = p.id
AND comDate >= DATE_SUB(
CURRENT_TIMESTAMP, INTERVAL 2 MONTH
) ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM
pet p
WHERE
p.userid=1
AND p.deviceID!=1