2014-02-08 28 views
-1

我试图按照他们的XXX服务的等级对医院进行功能排序。排序和限制php中的两个表查询

我有以下各表

hospital (hid, name) 
sratings (Service ratings) (hospitalId, ratingValue, serviceId) 
services (sid, name 
hrating (hid, ratingvalue) 

服务包含500多个服务。 我也有服务“sid”为xx服务

例如,如果我选择了服务心脏病学,它应该得到按服务评级排序的前50家医院。

什么是正确的查询。 查询的一部分,我已经做了,选择所有的医院,并将他们的评级从另一个表中盘点,但现在是无稽之谈。只是要排序并获得第50家医院通过服务XX额定

SELECT 
    hospital.*, 
    (SELECT AVG(hrating.rating_h) 
     FROM hrating 
     WHERE hrating.hid = hospital.hid) as overall_rating 
    FROM hospital 
+2

为什么downvote? –

+1

有趣的事情:你正在从'hratings'中选择一些东西,但那个并不在你的表格列表中... –

+0

为什么使用php标签? – Mark

回答

1

只需加入您的表,然后对结果进行排序:

SELECT hospital.* 
FROM  hospital 
    JOIN sratings ON sratings.hospitalId = hospital.hid 
    JOIN services ON services.sid = sratings.serviceId 
WHERE services.name = 'Cardiology' 
ORDER BY sratings.ratingValue DESC 
LIMIT 50 

上面的查询假设(hospitalId, serviceId)是独特的sratings(例如,它是该表的主键)。否则,您将不得不定义您希望如何按相同服务对多个评级的医院进行分类,例如通过平均评分:

SELECT hospital.* 
FROM  hospital 
    JOIN sratings ON sratings.hospitalId = hospital.hid 
    JOIN services ON services.sid = sratings.serviceId 
WHERE services.name = 'Cardiology' 
GROUP BY hospital.hid 
ORDER BY AVG(sratings.ratingValue) DESC 
LIMIT 50 
+0

同意,并且只是注意到你没有“修复”该子查询并将其改为连接,但是简单却没有把它包括在你的答案中。删除评论,保持评级,但很好的答案。 –