Kullanıcı sumbitted iyi 5 ve sıralama popülariteye göre

2 Cevap php

Database setup (MySQL)

table: top_fives

id, uid, first,     second, third,   fourth, fifth,   creation_date
1,  1,   cheese,    eggs,   ham,     bacon,  ketchup, 2010-03-17
2,  2,   mayonaise, cheese, ketchup, eggs,   bacon,   2010-03-17

Kullanıcılar belirli bir konuda onların en iyi 5 gönderebilirsiniz. Şimdi popülariteye göre sipariş en iyi beşli bir özetini istiyorum.

Her sütun o kendi puan değeri vardır. sütun 'ilk' böylece 5 puan, 'ikinci' dört puan 'üçüncü' üç puan ve ödüllendirilir ...

Yani, benim örnekte böyle bir şey olmalı:

1 Cheese     (9 points = 5 + 4 -> 1 time in 'first' column and 1 time in 'second' column) 
2 Eggs       (6 points) 
3 Mayonaise  (5 points) 
4 Ketchup    (4 points) 
5 Bacon      (3 points) 
6 Ham        (3 points)

Ne durum bu tür için kolay çözüm (PHP) olurdu?

Şimdiden teşekkürler

2 Cevap

En iyi çözüm ilk etapta veri normalleştirdiklerinden olacaktır. Ve tek pratik çözüm düzgün bir şekilde normalleştirilmiş veritabanının davranışını taklit etmektir. Kesinlikle çözümü herhangi bir PHP kodu dahil olmamalıdır ve veritabanı üzerinde yapılmalıdır:

SELECT type, SUM(score)
FROM
(
(SELECT first as type, COUNT(*)*5 as score
 FROM top_fives
 GROUP BY first
) UNION
(SELECT second AS type, COUNT(*)*4 as score
 FROM top_fives
 GROUP BY second
) UNION
(SELECT third AS type, COUNT(*)*3 as score
 FROM top_fives
 GROUP BY third
) UNION
(SELECT fourth AS type, COUNT(*)*2 as score
 FROM top_fives
 GROUP BY fourth
) UNION
(SELECT fifith AS type, COUNT(*) as score
 FROM top_fives
 GROUP BY fifth
) 
)
GROUP By type
ORDER BY SUM(score) DESC;

C.

Çözelti, (aşağıya bakınız) ve tablo normalize olacaktır.

Eğer yapamıyorsanız, yapmanız gerekir:

Select name, Sum(points) total_points
From (
    Select first name, 5 points
    From top_fives
    Union
    Select second name, 4 points
    From top_fives
    Union
    ...
)
Group By name
Order By total_points Desc

Normalized solution:

food

food_id, food_name
1        cheese
2        eggs
3        ham
...

food_rating
------
uid, food_id, points
1    1        5
1    2        4
1    3        3
2    1        4

.

Select f.food_name, Sum(r.points) total_points
From food_rating r
Join food f On ( f.food_id = r.food_id )
Group By food_name
Order By total_points Desc