Класация
12 отговора
686 прегледа
Класация
Здравейте
имам следния въпрос - възможно ли е да се направи ъпдейт на класация само с една заявка(MySql 4.x). Пояснявам:
имам таблица: Sites с полета
Id - auto increment
SiteUrl - varchar
SiteIn - int (общ брой гласове за даден сайт)
SiteRank - int (място в класацията)
Има ли начин при промяна на SiteIn, с един UPDATE да се обнови SiteRank на всички записи, подредени спрямо SiteIn във низходящ ред?
имам следния въпрос - възможно ли е да се направи ъпдейт на класация само с една заявка(MySql 4.x). Пояснявам:
имам таблица: Sites с полета
Id - auto increment
SiteUrl - varchar
SiteIn - int (общ брой гласове за даден сайт)
SiteRank - int (място в класацията)
Има ли начин при промяна на SiteIn, с един UPDATE да се обнови SiteRank на всички записи, подредени спрямо SiteIn във низходящ ред?
Re: Класация
Виж дали можеш да подкараш нещо подобно:
cheers,
</wqw>
UPDATE Sites
SET Rank = (SELECT COUNT(*)
FROM Sites s
WHERE s.SiteIn >= Sites.SiteIn)
cheers,
</wqw>
Re: По-добре отговори ...
.. като те питат ако искаш да ти помогнат.
Има значение и то доста голямо
salle.online.bg/sig
Има значение и то доста голямо
salle.online.bg/sig
Re: По-добре отговори ...
Да, абсолютно си прав, 4.1.x e MySQL-a. На MSSQL работи, под MySQL не :/
Та salle, кажи си тежката дума.
Та salle, кажи си тежката дума.
Re: Кое?
Кое е това дето "не работи"?
Това което wqw ти предложи и за което вече му благодари ли?
salle.online.bg/sig
Това което wqw ти предложи и за което вече му благодари ли?
salle.online.bg/sig
Re: Кое?
Това за което благодарих на wqw "работи" с MSSQL(има проблем само ако има SiteIn с еднакви стойност), как аджеба да "работи" и под MySQL 4.1.x ?
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
а това засега не се поддържа нито в 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!
Пробвах го работи, ТОЧНО както го искам.
Вчера бях малко разочарован от отговора ти(по скоро заядливият тон, който лъхаше, явно всеки си има лоши дни), НО днес си доказал за сетен път, че си разбираш от работата.
Още едно голямо БЛАГОДАРЯ
Вчера бях малко разочарован от отговора ти(по скоро заядливият тон, който лъхаше, явно всеки си има лоши дни), НО днес си доказал за сетен път, че си разбираш от работата.
Още едно голямо БЛАГОДАРЯ
Re: Благодаря salle!
Е не е както го искаше щото не е една заявка а две.
Пък и честно казано предпочитам UPDATE ... x (SELECT ... FROM x) да го бяхме направили още в началото в 4.1
salle.online.bg/sig
Пък и честно казано предпочитам UPDATE ... x (SELECT ... FROM x) да го бяхме направили още в началото в 4.1
salle.online.bg/sig
Re: Благодаря salle!
И не само! Чудя си кога ли ще имплементирате SQL-92 по стандарта (от 1992!)
Точно преди малко разцъках Common Table Expressions (CTE) на MSSQL 2005 -- много е благо (особено за йерархии тип adjacency list). А това е от спецификацията на SQL-99 :-))
cheers,
</wqw>
Точно преди малко разцъках Common Table Expressions (CTE) на MSSQL 2005 -- много е благо (особено за йерархии тип adjacency list). А това е от спецификацията на SQL-99 :-))
cheers,
</wqw>