【问题标题】:My SQL - Refer data from another table rowsMy SQL - 从另一个表行中引用数据
【发布时间】:2016-04-30 19:37:40
【问题描述】:

我不知道这是否可能。 我有两张桌子:

医院表中的列

  • 医院编号
  • 姓名
  • 平均评分

评分表中的列

  • 身份证
  • 评分1
  • 评分2
  • 评分3
  • 评分4
  • 评分5
  • 评分6
  • 医院编号

rating1rating6 是评级类型。现在通过calculation,我可以通过以下 SELECT 查询在ratings 表中获得particular hospitalaverage rating

SELECT IFNULL((SUM(charges) + SUM(behaviour) + SUM(admission) + SUM(properInformation) 
                   + SUM(hygine) + SUM(treatment))/(count(hospitalID) * 6), 0
                  ) AverageRating,COUNT(ID) RatingCount 
   FROM ratings
   WHERE hospitalID = '111111'

上面的查询非常适合我,但这个averageRating 我也想在我的医院表中计算,因为我想对医院进行排名。

mySQL中是否有任何函数可以通过参考评分表来计算医院表的平均评分。

评级表

查询输出表

【问题讨论】:

  • @AJ 是的。它是我提到的 Rating1、Rating2 等的评级类型。它们是评级的类型
  • 那你可以试试我提供的解决方案。
  • @AJ 是的,您的解决方案对我有用,但是有什么方法可以创建类似的函数,所以每当我在该 AverageRatings 列中选择医院表时,特定医院的平均得分应该自动得到计算。因为正如我提到的,我需要根据医院的平均评分来计算医院的排名
  • @AJ 我唯一的动机是根据平均评分显示医院排名。如果我这样做的方式不可能或复杂,请建议我任何其他方式
  • 没有这个功能。您必须编写自己的查询。尝试第二个查询。它将计算每家医院的平均评分和排名。

标签: mysql sql


【解决方案1】:

根据给定的表结构,你可以试试这个。

编辑

SELECT avgratings.*, @curRow := @curRow + 1 AS hospitalRank
FROM (
    SELECT (SUM(r.`rating1`)+SUM(r.`rating2`)+SUM(r.`rating3`)+SUM(r.`rating4`)+SUM(r.`rating5`)+SUM(r.`rating6`))/(COUNT(r.`hospitalID`)*6) AS AverageRating, h.hospitalID
    FROM hospitals h INNER JOIN ratings r
    ON h.`hospitalID`=r.`hospitalID`
    WHERE 1 GROUP BY r.`hospitalID` 
) avgratings JOIN (SELECT @curRow := 0) rank
ORDER BY avgratings.AverageRating DESC

第二次查询来获得特定医院的排名。

SELECT tablea.*
FROM (
    SELECT avgratings.*, @curRow := @curRow + 1 AS hospitalRank
    FROM (
        SELECT (SUM(r.`rating1`)+SUM(r.`rating2`)+SUM(r.`rating3`)+SUM(r.`rating4`)+SUM(r.`rating5`)+SUM(r.`rating6`))/(COUNT(r.`hospitalID`)*6) AS AverageRating, h.hospitalID
        FROM hospitals h INNER JOIN ratings r
        ON h.`hospitalID`=r.`hospitalID`
        WHERE 1 GROUP BY r.`hospitalID` 
    ) avgratings JOIN (SELECT @curRow := 0) rank

) tablea
WHERE tablea.hospitalID=1 ORDER BY tablea.AverageRating DESC

WHERE 块中的1 替换为hospitalID

【讨论】:

  • 为什么只计算一家医院?
  • 第二个查询我只得到 1 个结果。我已经对 2 家医院进行了评级,因此应该计算两者的排名。同样,由于许多医院都给出了评级,因此应该按照他们的平均评级进行排名
  • 我也像这样 (10,10,10,10,10,10) 给医院 1 评分,所以它的平均值是 10。当给医院 2 评分时,医院 1 的平均评分发生了变化,这是错误的。
  • 是的,这是必要的,因为医院有 6 种评级
  • 这里有一些小问题。因为它计算评级表的每个 ID 的排名,所以这里发生的情况是假设如果医院 1 被 10 个不同的人投票 10 次,那么每次对于同一家医院,它都会生成多个排名。看我上面的截图。您可以看到同一家医院有多个等级。请参阅医院 ID 446795 已投票 3 次,因此它计算了它的排名三次。理想情况下,用户投票的次数应该加起来,应该乘以 6,每个用户投票的总数应该计算得到医院的平均评分,并且应该给出该排名。
【解决方案2】:

我不确定我是否理解您的问题...

您通过以下方式获得单个记录的平均值:

charges + behaviour + admission + properInformation + hygine + treatment / 6

因此你得到总平均数:

avg(charges + behaviour + admission + properInformation + hygine + treatment / 6)

我要求按医院获取,您可以按医院 ID 分组:

select
  hospitalid,
  avg(charges + behaviour + admission + properinformation + hygine + treatment / 6) as avr,
  count(*) as rating_count
from ratings
group by hospitalid
order by 2 desc;

您可以通过加入医院表来选择医院数据(例如医院名称)。例如

select
  h.hospitalid,
  h.name,
  avg(r.charges + r.behaviour + r.admission +
      r.properinformation + r.hygine + r.treatment / 6) as average_rating,
  count(*) as rating_count
from hospitals h
left join ratings r on r.hospitalid = h.hospitalid
group by h.hospitalid
order by average_rating desc;

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2018-03-13
    • 2016-07-22
    • 2021-01-20
    • 2020-11-05
    • 2020-06-07
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多