Класация

12 отговора 686 прегледа
#1

Класация

Здравейте
имам следния въпрос - възможно ли е да се направи ъпдейт на класация само с една заявка(MySql 4.x). Пояснявам:
имам таблица: Sites с полета
Id - auto increment
SiteUrl - varchar
SiteIn - int (общ брой гласове за даден сайт)
SiteRank - int (място в класацията)

Има ли начин при промяна на SiteIn, с един UPDATE да се обнови SiteRank на всички записи, подредени спрямо SiteIn във низходящ ред?

Отговор
в отговор на Pitasht #2

Re: Класация

Зависи дали MySQL-а е 4.0.x или 4.1.x

cheers,
</wqw>

Отговор
в отговор на wqw #3

Re: Класация

Няма значение, важното да се каже някакво решение!

Отговор
в отговор на Pitasht #4

Re: Класация

Виж дали можеш да подкараш нещо подобно:
UPDATE      Sites

SET Rank = (SELECT COUNT(*)
FROM Sites s
WHERE s.SiteIn >= Sites.SiteIn)

cheers,
</wqw>

Отговор
в отговор на Pitasht #5

Re: По-добре отговори ...

.. като те питат ако искаш да ти помогнат.

Има значение и то доста голямо

salle.online.bg/sig
Отговор
в отговор на wqw #6

Re: Класация

Благодаря!
Точно това ми трябваше :)

Отговор
в отговор на salle #7

Re: По-добре отговори ...

Да, абсолютно си прав, 4.1.x e MySQL-a. На MSSQL работи, под MySQL не :/
Та salle, кажи си тежката дума.

Отговор
в отговор на Pitash #8

Re: Кое?

Кое е това дето "не работи"?

Това което wqw ти предложи и за което вече му благодари ли?

salle.online.bg/sig
Отговор
в отговор на salle #9

Re: Кое?

Това за което благодарих на wqw "работи" с MSSQL(има проблем само ако има SiteIn с еднакви стойност), как аджеба да "работи" и под MySQL 4.1.x ?

Отговор
в отговор на Pitasht #10

Re: Кое?

А .. вчера ми се беше събрало много та съм проспал че опитваш UPDATE x .. (SELECT .. FROM x)

а това засега не се поддържа нито в 4.1 нито в 5.0


Ето ти един вариант който е "хакерски" и освен това изисква да инициализираш променливата преди заявката така, че пак не е една заявка а две:


mysql> select * from Sites;
+--------+------+
| SiteIn | Rank |
+--------+------+
| 5 | 2 |
| 3 | 3 |
| 10 | 1 |
+--------+------+
3 rows in set (0.00 sec)


mysql> SET @r = 0; UPDATE Sites SET Rank= (@r:=@r+1) ORDER BY SiteIn;
Query OK, 0 rows affected (0.00 sec)

Query OK, 2 rows affected (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 0

mysql> select * from Sites ORDER BY Rank;
+--------+------+
| SiteIn | Rank |
+--------+------+
| 3 | 1 |
| 5 | 2 |
| 10 | 3 |
+--------+------+
3 rows in set (0.00 sec)


Най добре е да го реализираш с TRIGGER защото тогава промяната ще става автоматично при промяна на SiteIn ама за целта ти трябва 5.0

salle.online.bg/sig
Отговор
в отговор на salle #11

Благодаря salle!

Пробвах го работи, ТОЧНО както го искам.

Вчера бях малко разочарован от отговора ти(по скоро заядливият тон, който лъхаше, явно всеки си има лоши дни), НО днес си доказал за сетен път, че си разбираш от работата.

Още едно голямо БЛАГОДАРЯ

Отговор
в отговор на Pitasht #12

Re: Благодаря salle!

Е не е както го искаше щото не е една заявка а две.

Пък и честно казано предпочитам UPDATE ... x (SELECT ... FROM x) да го бяхме направили още в началото в 4.1

salle.online.bg/sig
Отговор
в отговор на salle #13

Re: Благодаря salle!

И не само! Чудя си кога ли ще имплементирате SQL-92 по стандарта (от 1992!)

Точно преди малко разцъках Common Table Expressions (CTE) на MSSQL 2005 -- много е благо (особено за йерархии тип adjacency list). А това е от спецификацията на SQL-99 :-))

cheers,
</wqw>

Отговор