2016-04-30 22 views
2

可能かどうかはわかりません。 私は2つのテーブルがあります。病院私のSQL - 別のテーブル行からデータを参照する

  • 列hospitalIDを評価で

  • 名前
  • AverageRating

rating6
  • ID
  • rating1
  • rating2
  • rating3
  • rating4
  • rating5
  • rating6
  • hospitalID

rating1評価の種類です。今calculationことで、私は完全に私のために動作しますが、このaverageRatingは、私も、私はランクの病院にしたいので、私の病院テーブルに計算したい

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' 

クエリの上にSELECTクエリを次からratings表にparticular hospitalaverage ratingを取得することができています。

mySQLには、評価表を参照して病院への平均評価を計算する関数がありますか。与えられたテーブル構造に基づいて

評価表 enter image description here

クエリの出力表 enter image description here

+0

@AJはい。私がRating1、Rating2などと言ったような評価のタイプです。評価のタイプは –

+0

です。私が提供したソリューションを試すことができます。 –

+0

@AJはいあなたのソリューションは私のために働いたが、私は特定の病院のAverageRatings列平均スコアが自動的に計算する必要があります病院のテーブルを選択するたびに私は同様の種類の関数を作成することができます何らかの方法です。私が言及したように、彼らの平均格付けに基づいて病院のランキングを計算する必要があるので –

答えて

3

、あなたはこれを試すことができます。特定の病院のランクを取得する

EDIT

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 

hospitalIDWHEREブロックで1を交換してください。

+0

を参照してくださいできますか? –

+0

2番目のクエリでは1つの結果しか得られませんでした。私は2つの病院に評価を与えているので、ランキングは両方のために計算する必要があります。同様に多くの病院が格付けを与えているのと同じように平均格付けが –

+0

にランクインされていなければなりません。私はこのような病院1に格付けをしています(10,10,10,10,10,10)ので、平均は10です。病院1の変更は間違っています。 –

1

私はあなたの質問を理解していますか?

あなたがして単一のレコードのavarageを取得:hospital_idによってあなたのグループと思い、私は病院ごとにそれを得るため

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

:あなたがして、したがって、総avarageを取得

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

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; 
関連する問題