简体   繁体   中英

mysql select multiple avg columns using where in condition and join query

how to use where in condition with this query? like, WHERE institutions.instituteId IN ("1","2","4","15").

SELECT (SELECT avg(rating_score.score) FROM reviews INNER JOIN rating_score ON  reviews.reviewsId=rating_score.reviewsId WHERE reviews.instituteId='13' AND ratingItemId='1') as 'Acadamics', 
(SELECT avg(rating_score.score) FROM reviews INNER JOIN rating_score ON reviews.reviewsId=rating_score.reviewsId WHERE reviews.instituteId='13' AND ratingItemId='2') as 'Area_of_study',
(SELECT avg(rating_score.score) FROM reviews INNER JOIN rating_score ON reviews.reviewsId=rating_score.reviewsId WHERE reviews.instituteId='13' AND ratingItemId='3') as 'Campus_Facilities', 
(SELECT avg(rating_score.score) FROM reviews INNER JOIN rating_score ON reviews.reviewsId=rating_score.reviewsId WHERE reviews.instituteId='13' AND ratingItemId='4') as 'Acommadatoin',
(SELECT avg(rating_score.score) FROM reviews INNER JOIN rating_score ON reviews.reviewsId=rating_score.reviewsId WHERE reviews.instituteId='13' AND ratingItemId='5') as 'Sports_Facilities',
institutions.instituteId, institutions.instituteName, institutions.location, countries.countryName, institutions.siteAddress, institutions.overallRatings FROM institutions INNER JOIN countries ON institutions.countryId=countries.countryId 
WHERE institutions.instituteId='13'

This is similar to the solutions in need to return two sets of data with two different where clauses but uses AVG instead of SUM . The main difference is that you don't use ELSE 0 in the CASE , because you don't want to average 0 for all the rows with a different raingItemId . AVG() will just ignore those null rows.

SELECT 
    AVG(CASE WHEN ratingItemId='1' THEN rs.score END) AS Academics,
    AVG(CASE WHEN ratingItemId='2' THEN rs.score END) AS Area_of_study,
    AVG(CASE WHEN ratingItemId='3' THEN rs.score END) AS Campus_Facilities,
    AVG(CASE WHEN ratingItemId='4' THEN rs.score END) AS Acommadatoin,
    AVG(CASE WHEN ratingItemId='5' THEN rs.score END) AS Sports_Facilities,
    i.instituteName, i.location, c.countryName, i.siteAddress, i.overallRatings
FROM institutions AS i
INNER JOIN countries AS c ON i.countryId=c.countryId
LEFT JOIN reviews AS r ON r.instituteId = i.instituteId
LEFT JOIN rating_score AS rs ON rs.reviewsId = r.reviewsId
WHERE i.instituteId IN (1, 2, 4, 15)
GROUP BY i.instituteId

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM