Değerlendirmesi yerleri atama (MySQL, PHP)

7 Cevap php

Ben aşağıdaki sütunları ile MySQL veritabanı var:

id     company      rating_score     rating_place

Ben şirket ve her bir şirket için değerlendirme puanları var. Yani, benim db gibi görünüyor:

id     company      rating_score     rating_place

75     Intel         356.23          

34     Sun           287.49

etc.

Nasıl PHP ve MySQL kullanarak skoruna göre yerleri (benim rating_place sütun boştur) atayabilirsiniz?

Teşekkür ederiz!

7 Cevap

Buna ne dersiniz:

update mytable set rating_place =(select count(*)+1 from mytable intb where intb.rating_score>mytable.rating_score)

----edit (after comment) aww sorry, you can't select from the same table that you're updating in mysql, so try it with a temp table:

create table mytemptable as 
    select @row := @row +1 as place, mytable.id 
        from mytable, (SELECT @row := 0) r
        order by rating_score desc;

ve sonra sadece benzer bir güncelleme:

update mytable set rating_place = (
    select place 
        from mytemptable 
        where mytemptable.id=mytable.id
    )

bundan sonra bu MyTempTable bırakabilirsiniz.

Eğer ayrı bir tablo kaçınmak istiyorsanız ve php kullanmak eğer, deneyebileceğiniz rağmen

$res=mysql_query("select id from mytable order by rating_score desc");
$ratings=array();
while ($r=mysql_fetch_assoc($res)) {
    $ratings[]=$r['id'];
}
foreach ($ratings as $key=>$val) {
    mysql_query("update mytable set rating_score=".($key+1)." where id=".$val);
}

Andrew G. Johnson doğru olsa da, hatta veritabanında bu bilgileri saklamak için gerek olmayabilir.

Senin için cevap basit: "Neden veritabanında bu saklamak istiyorsun?"

Eğer gerçekten iyi bir nedeniniz varsa, o zaman veri nasıl statik dayalı bir kaç seçenek var. Veri seferde eklenir sonra oluşturulmuş ise (rating_place 1 otomatik atanmışsa), daha sonra ORDER BY rating_score DESC senin ifadenin sonunda bunu yapmalıdır.

Aksi takdirde, ben, senin 2 sütun okunur kez rating_place atar özel bir PHP sayfasında bir şeyler yapardı. Eğer elle veritabanına veri girerseniz, bu sayfayı açmak zorunda zarar olmamalıdır. Veri toplama otomatik varsa, devam edin ve derece günceller "update_places_page" bir çağrı atmak.

Edit:

Başka bir seçenek, sadece rating_score dayalı yeni görünümü ve gerçek tablodan seçin, ilk 20 alır ve emir olarak tekrar sıralar rating_score bir görünüm yaratmak için olduğunu.

Sadece düşük SQL sorgusu sonuna kadar bu eklemek için sırala yüksek rating çalışıyorsanız:

ORDER BY rating_score DESC

Ya da en düşük en yüksek:

ORDER BY rating_score ASC

Hala [I karşı tavsiye ediyorum] Bu şekilde yapmak istiyorsanız bu deneyin:

UPDATE mytable SET rating_place=(SELECT COUNT(*)+1 FROM mytable tablecheck WHERE tablecheck.rating_score > mytable.rating_score)

Sadece sıralama Reytinge göre! Bu yaklaşım size bir şey eklerseniz, belirli bir rütbe yukarıdaki tüm verileri değiştirmek kayması var gibi sadece yanlış. Kötü veri yapısı.

Peki, sadece bir veya iki kez bir yıl bir şey eklemek eğer bu tamsayı sıralama hızlı olduğu ileri sürülebilir, ama sıralama Ağaç endekslerinde değil comparision dayanmaktadır de sadece çok az bir fark bu.

So I have seen solutions like Andrew G. Johnson's. You could also tweak this further and only update entries with a higher score. You could also create a trigger that does it automatically for you.

Ama bu yanlış bana neden anlatalım:

Its redundant data. Its not atomic and consistent. In a good atabase design you should always (if possible) store every information only at one point so it can be modified, deleted in an atomic way. So you can avoid any inconsistencies and complications in the first place. If you really wan't to "cache" the ranking, do it in your application.

Eğer gerçekten böyle adlandırılan veritabanı alanları olmasını istiyorsanız bu sizin için alternatifler nelerdir?

Create a mysql view based on the sorted query. You can also do caching there AFAIK if thats your goal.

Ancak önbelleğe alma için iyi bir seçenek, sadece mysql sorgu önbellek sizin için çalışma yapalım olacaktır. Bu çok iyi bir seçenek olacaktır.

Ben, buna karşı tek geçerli argümanlar yapmak için çalışıyoruz ne yapmak için ne kadar şimdiye kadar hiçbir neden göremiyorum.

SELECT @row := 0;
UPDATE
    `table`
SET
    `table`.`rating_place` = (@row := @row +1)
ORDER BY
    `table`.`rating_score` DESC;

PS: Eğer PHP sorgular göndererek edilecektir PHP MySQL uzantısı genellikle çağrı başına yalnızca tek sorgu sağlar beri, sen, iki bölmek gerekir.

yourQueryFunc('SELECT @row := 0;');
yourQueryFunc('
    SELECT @row := 0;
    UPDATE
        `table`
    SET
        `table`.`rating_place` = (@row := @row +1)
    ORDER BY
        `table`.`rating_score` DESC;');

Ben azalan fıkra ile sırasını kullanarak bir seçme yapmak ve sonra derece ile her satırı güncelleştirmek.

Bu gitmek gibi bir yerde çalışmak için muhtemelen çok daha uygundur. Bunu yapmak için, Rating_Score (ASC) tarafından değerlerini ve düzeni okurdum. Eğer onları okumak gibi Sonra yerde sırasına olurdu. İsterseniz, daha sonra tekrar tabloya bu yazabilirim, ama bu sürekli yer değerini güncelleştirmek zorunda anlamına gelir. Bu veritabanı sürekli kullanıcı girişi falan değişiyor olacak ise, ben gitmek gibi yerlerde çalışma öneriyoruz. Tablo çoğunlukla statik kalır, bir yerde bir sütun olabilir.