Jump to content
php.lv forumi

Multiply mysql update


hEiti

Recommended Posts

Ka ir iespejams izveidot sistemu

Kad mysql tiek updeitots shada algoritma:

UPDATE 1 table row abcd WHERE group = 111 SET value = foo

UPDATE 2 table row abcd WHERE group = 222 SET value = doo

UPDATE 3 table row abcd WHERE group = 333 SET value = boo

 

Doma tada ka vajag sho visu viena reize, kad mysql updeito vienu lauku visiem ierakstiem kuri pieder grupai a un updeito ar citu vertibu visus kas pieder grupai b un ar vell citu vertibu visus kas pieder grupai c ...

 

Vai maz tas ir iespejams? un ja ja tad kaa ?

 

Tas ko velos panakt ir visus kas pieder grupai a,b vai c esoshos elementus sarindot,

piemeram

Davis grupa a

Lauris grupa a

 

Maris grupa b

Anete grupa c

 

Tad Davis iesgust vertibu 1

Laursi iegust 1

 

Maris iegust 2

Anete iegust 3

 

Pec padotam vertibam .. visu ar vienu soli ... ja maz tas ir iespejams ..

problema tada, kad grupu skaits var but "neierobezots" ... idejiski ..

Edited by hEiti
Link to comment
Share on other sites

Pec padotam vertibam .. visu ar vienu soli ... ja maz tas ir iespejams ..

problema tada, kad grupu skaits var but "neierobezots" ... idejiski ..

Nee ar vienu kveriju to nevaresi izdriit, naksies vien veikt vairkus pieprasijumus UPDATES

Link to comment
Share on other sites

To var tādā gadījumā, ja Tev tās vērtības foo, doo un boo jau ir bāzē kādā tabulā ar atbilstošo grupas id, vai kodu vai whatever kādu citu unikālu lauku, pēc kura tās var atlasīt. Citādi nekas nesanāks, jo neko sarežģītāku par skalāriem mainīgajiem AFAIK MySQL nesaprot, bet šīs vēlmes izklausās pēc masīvveidīgas konstrukcijas tipa kolekcijas no pārīšiem - grupas id (vai nosaukuma), vērtība.

 

 

Padomāju un atcerējos, ka tādas lietas taču reizēm feikoja ar nosacīti sakodētu string mainīgo :)

 

Vobše čerez dziļu ž to izdarīt var. Tātad man ir tabula persons:

mysql> desc persons;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| prs_id     | int(11)      | NO   | PRI | NULL    |       |
| prs_grp_id | int(11)      | NO   |     | NULL    |       |
| prs_name   | varchar(10)  | NO   |     | NULL    |       |
| prs_value  | varchar(100) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> select * from persons;
+--------+------------+----------+-----------+
| prs_id | prs_grp_id | prs_name | prs_value |
+--------+------------+----------+-----------+
|      1 |        345 | Davis    | NULL      |
|      2 |        345 | Lauris   | NULL      |
|      3 |        765 | Maris    | NULL      |
|      4 |          1 | Anete    | NULL      |
+--------+------------+----------+-----------+
4 rows in set (0.00 sec)

 

Kā redzam visiem prs_value ir tukšs.

Nu un tagad varam pieņemt, ka mums ir simbolu virkne spec formātā <grupas_id:vērtība,>

Tad atliek tikai izkasīt ārā vērtību atbilstoši grupas id. Iespējams, ka to var izdarīt kaut kā īsāk, bet te nu ir mans variants :)

Nu un, protams, ka šis var nestrādāt, ja vērtībā ir iekšā kols vai komats.

mysql> set @str := '1:foo, 345:boo, 765:zoo,';
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> UPDATE persons
   -> SET prs_value =
   -> substr(@str,
   ->        locate(concat(prs_grp_id, ':'), @str) + length(concat(prs_grp_id,':')),
   ->        locate(',', @str, locate(concat(prs_grp_id, ':'), @str)) - locate(concat(prs_grp_id, ':'), @str) - length(concat(prs_grp_id, ':'))
   ->       );
Query OK, 4 rows affected (0.03 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from persons;
+--------+------------+----------+-----------+
| prs_id | prs_grp_id | prs_name | prs_value |
+--------+------------+----------+-----------+
|      1 |        345 | Davis    | boo       |
|      2 |        345 | Lauris   | boo       |
|      3 |        765 | Maris    | zoo       |
|      4 |          1 | Anete    | foo       |
+--------+------------+----------+-----------+
4 rows in set (0.00 sec)

 

Gints Plivna

http://datubazes.wordpress.com/

 

P.S. Ja tā doma darīt, tad piprms ida arī jāliek kols, jo citādi 1: un 11: priekš id = 1 atradīs abos gadījumos un iespējams nepareizi. Tb stringā jāliek :1: vai :11:.

Edited by Gints Plivna
Link to comment
Share on other sites

Njā, šoreiz Gints ir pacenties izdomāt kārtīgu smadzeņlauzi :)

 

 

To var tādā gadījumā, ja Tev tās vērtības foo, doo un boo jau ir bāzē kādā tabulā ar atbilstošo grupas id, vai kodu vai whatever kādu citu unikālu lauku, pēc kura tās var atlasīt.

Šķiet, ka pirmā doma bija tā preizākā un realizācijā vienkāršākā:

UPDATE persons, 
(SELECT 1 as grp_id, 'foo' as value 
UNION ALL 
SELECT 345, 'boo' 
UNION ALL 
SELECT 765, 'doo') src 
SET persons.prs_value=src.value 
WHERE persons.prs_grp_id=src.grp_id

Edited by basic
Link to comment
Share on other sites

uz ātru roku piemers !

$x = mysql_qury("update xx (x) VALUES ('".$xs."') ");
if(mysql_query($x))
{
taisam nākamo update :) pec šada principa ceru ka saprati ideju :) tālak ar elseif un tamlīdzigi var darīt :) vēlu veiksmi :)
}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...