Karmaşık MySQL sorgu?

2 Cevap php

Aşağıdaki gibi iki tablo var:

Ben bir olumlu ya da olumsuz değerlendirme olup olmadığını bir ratingname ve bir bit içeren bir RatingsTable var:

RatingsTable
----------------------
ratingname  ispositive
----------------------
Good        1
Bad         0
Fun         1
Boring      0

Kişi derece, derece ve nominal şey: ve ben şeyler hakkında geri bildirim içeren bir FeedbackTable var. Bu RatingsTable dayalı bir olumlu ya da olumsuz değerlendirme ise geribildirim tespit edilebilir.

FeedbackTable
---------------------------------
username  thing        ratingname
---------------------------------
Jim       Chicken      Good
Jim       Steak        Bad
Ted       Waterskiing  Fun
Ted       Hiking       Fun
Nancy     Hiking       Boring

Ben aşağıdaki için etkin bir MySQL sorgusu yazmaya çalışıyorum:

Bir sayfada, ben pozitif derecelendirme en yüksek oranda en iyi 'şeyler' göstermek istiyorum. Ben geribildirim tablosundan ürün Jim Tavuk İyi 20 kez puan varsa ... o sadece bir kez sayılması gerektiğini, benzersiz ... anlamı olduğundan emin olmak istiyorum. Bir noktada ben de bu sayfada için sayılmasına değerlendirmesi az sayıda (en az 10) gerektirecek isteyeceksiniz. Ben yüksek oransal olumsuz değerlendirmesi için aynı şeyi isteyeceksiniz, ama ben buna göre pozitif için bir çimdik eminim.

2 Cevap

Bu sorguyu kullanabilirsiniz iyi değerlendirmesi oranında sırasına "şeyler" almak için:

SELECT thing, SUM(ispositive) / COUNT(*) AS proportion_positive
FROM (SELECT DISTINCT username, thing, ratingname FROM FeedbackTable) T1
JOIN RatingsTable T2
ON T1.ratingname = T2.ratingname
GROUP BY thing
ORDER BY proportion_positive DESC

Lütfen örnek veriler için bu döndürür:

thing        proportion_positive
Chicken      1.0000
Waterskiing  1.0000
Hiking       0.5000
Steak        0.0000

Sonuçlarında bir şey görüntülemeden önce en az 10 oy gerektirecek sonra bu satırı eklemek GROUP BY:

HAVING COUNT(*) >= 10

Negatif değerlendirme değişim SUM(ispositive) e kadar bir oran elde etmek için SUM(NOT ispositive).

Not: yerine sadece disctinct değerleri seçerek sizin oylama tabloya benzersiz bir kısıtlama eklemek için daha iyi olabilir.

SELECT *
FROM `feedback`
LEFT JOIN `ratings` ON `feedback`.`rating` = `rating`.`label`
ORDER BY `rating`.`value` DESC
GROUP BY `feedback`.`username`
LIMIT 10

Özeti: görüşlerinizi masaya derecelendirme katılmak, ancak kullanıcı adı ile grup böylece sadece sonucu başına bir adı olsun.