Zapytanie do bazy / zmiana wartości komórek

0

Mam przypadek tabeli, w której załóżmy mam dwie kolumny id_product oraz id_shop. Wartości pierwszej kolumny i drugiej pozostają z sobą w relacji, to znaczy:

lp		id_product		id_shop
1		 1				 1
2		 1				 2
3		 1				 3
4		 1				 4
5		 1				 5
6		 1				 6
7		 1				 7
8		 1				 8
9		 1				 9
10		2				 1
11		2				 2
12		2				 3
13		2				 4
14		2				 5
15		2				 6
16		2				 7
17		2				 8
18		2				 9
19		3				 1

itd.

Jednak w pewnym momencie tabeli wartości id_shop zaczynają być wyłącznie jedynkami. Teraz - w jaki sposób mogę np. dla zakresu id_product 100-1000 "wznowić" iterację wartości id_shop od 1 do 9 względem wartości id_product, żeby zamiast:

lp		id_product		id_shop
1		 1				 1
2		 1				 1
3		 1				 1
4		 1				 1
5		 1				 1
6		 1				 1
7		 1				 1
8		 1				 1
9		 1				 1
10		2				 1
11		2				 1
12		2				 1
13		2				 1
14		2				 1
15		2				 1
16		2				 1
17		2				 1
18		2				 1
19		3				 1

itd.

...otrzymać to, co zaprezentowałem w pierwszym przykładzie? Będę niezmiernie wdzięczny za pomoc.

PS kolumna lp nie istnieje w tabeli. Podałem ją tylko w celach ilustracyjnych.

0

Masz jakiś PK lub UI na tabeli? id_shop jakiego typu jest?

0

Jeśli nie masz żadnego PK, ani UI, to po prostu dodaj PK auto_increment np. id.
Potem musisz zrobić coś w ten deseń:

UPDATE tabela t SET id_shop=(SELECT Count(*) FROM tabela WHERE id<t.id)%10
0

Z ciekawości chciałem zobaczyć jak działa to rozwiązanie i okazało się że baza zwraca błąd:

You can't specify target table 't' for update in FROM clause

A tak przy okazji co oznacza %10 na końcu zapytania ?

2

Zapomniałem, że MySQL tak ma...

update table1 t join (select id, (select count(*) from table1 where id<=t.id and id_product=t.id_product) lp from table1 t) x on x.id=t.id set t.id_shop =x.lp

Poprawiony na dodatek warunek (dodany id_product)
a %10 znaczy się modulo 10 - nie wiem czemu, ale wydawało mi się, że ma być tam reszta z dzielenia na 10 :)

0
Marcin.Miga napisał(a):

Zapomniałem, że MySQL tak ma...

update table1 t join (select id, (select count(*) from table1 where id<=t.id and id_product=t.id_product) lp from table1 t) x on x.id=t.id set t.id_shop =x.lp

Poprawiony na dodatek warunek (dodany id_product)
a %10 znaczy się modulo 10 - nie wiem czemu, ale wydawało mi się, że ma być tam reszta z dzielenia na 10 :)

PS dodam jeszcze tylko, że lp nie istnieje w prawdziwej tabeli. Dodałem ją tylko dla celów ilustracyjnych. Aha, i oczywiście oprócz kolumn id_product i id_shop istnieją inne kolumny, których wartości zmieniać nie chcę.

1

Problem jest taki, że jeśli Twoja tabela miała 2 kolumny, to to lp (jako id tabeli) trzeba dodać aby wykonać Twój specyficzny updejt. Z drugiej strony jeżeli jednak ta tabela posiada jeszcze inne kolumny to w zależności jakie one zawierają dane możliwe że jest szansa zrobić updejt bez przerabiania tabeli.

1

Zapytanie, które napisałem robi UPDATE (czyli modyfikuje) tylko i dokładnie 1 kolumny- id_shop. lp oczywiście, że nie istnieje - jest wyliczane w podzapytaniu x. Ale musi istnieć klucz (PK) (lub chociaż indeks unikalny UI), na podstawie którego to lp będzie wyliczone. Dlatego gdzieś tam u góry najpierw pytałem, czy masz PKJ, a jak odpowiedziałeś, że nie masz, to napisałem, być dodał kolumnę ID auto_increment jako PK.

0

Problem rozwiązany. Okazało się, że sytuacja uległa zmianie i obecne rozwiązanie nie może już mieć zastosowania w rzeczywistości. Dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1