Jump to content
php.lv forumi

vaicājuma optimizēšana


ray

Recommended Posts

Vai ir iespējams šādus vaicājumus/kodu apvienot vienā, lai nav 2 pieprasījumi uz datu bāzi?

 

if(mysql_num_rows(mysql_query("SELECT * FROM table WHERE id = 1 AND field = 'value'")) == 0) {
mysql_query("INSERT INTO table SET field = 'value'");
}

Edited by ray
Link to comment
Share on other sites

Vai ir iespējams šādus vaicājumus/kodu apvienot vienā, lai nav 2 pieprasījumi uz datu bāzi?

 

if(mysql_num_rows(mysql_query("SELECT * FROM table WHERE id = 1 AND field = 'value'")) == 0) {
mysql_query("INSERT INTO table SET field = 'value'");
}

Diemžēl nav īsti skaidrs, kāda ir biznesa jēga tam visam tāpēc arī iespējams vairāki ieteikumi. Kā arī nav skaidrs vai tiešām šeit ir atsauce uz ID t.i. vai tiešām ir svarīgi ka konkrētai id vērtībai ir dotā vērtība 'value'?

Bet vispār ja dzelžaini mēģinam implementēt to, ko autors vēlas (pieņemot protams, ka id un field var būt ar mainīgām vērtībām), tad ļoti prasās pēc merge SQL teikuma, kas diemžēl MySQLā nav. Un tā kā tas nav, tad jāskatās, ko tas dara. Un patiesībā tas veic ārējo savienojumu (outer join) starp izejas tabulu - šai gadījumā fiksētu vienu ierakstu ar noteiktām vērtībām - un mērķa tabulu - šai gadījumā tabulu table.

Tātad tas varētu izskatīties aptuveni šādi:

mysql> create table tbl(id integer auto_increment key, field varchar(10));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into tbl (field)
-> select new_field from (
->   select new_field, field as tbl_field
->   from (select 'val' new_field from dual) as q
->   left outer join tbl
->   on q.new_field = tbl.field and id = 1) as rez
-> where tbl_field is null;
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into tbl (field)
-> select new_field from (
->   select new_field, field as tbl_field
->   from (select 'val' new_field from dual) as q
->   left outer join tbl
->   on q.new_field = tbl.field and id = 1) as rez
-> where tbl_field is null;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

 

Kā redzams pirmais insert pievienoja vienu ierakstu, bet otrreiz izpildot to pašu vairs nē, jo mēs atlasam fiksētā ieraksta ārējo savienojumu ar tabulu tbl un ar where klauzu atsijājam tos gadījumus, kad tāds ieraksts tabulā tbl jau ir atrasts. Iespējams, ka kaut ko tur var saīsināt tai viena ieraksta atlasē, bet man īsti neizdevās.

 

Nobeigumā - neesmu pārliecināts, ka no ātrdarbības viedokļa, šis ir labāk kā 2 sql teikumi ņemot vērā, ka te ir čupa ar apakšvaicājumiem un liekas 2 atvasināts tabulas, kuras nezinu kā tur īsti ir, bet laikam jau MySQL arī izveido. Tā kā mēģinājums ir tīri sportisks, iespējams bez praktiskas vērtības :)

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

×
×
  • Create New...