ray Posted July 9, 2008 Report Share Posted July 9, 2008 (edited) 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 July 9, 2008 by ray Link to comment Share on other sites More sharing options...
andrisp Posted July 9, 2008 Report Share Posted July 9, 2008 Taisi procedūru. Link to comment Share on other sites More sharing options...
Klez Posted July 9, 2008 Report Share Posted July 9, 2008 ir otrejaads variants http://dev.mysql.com/doc/refman/5.0/en/insert-select.html bet shitam variantam jau arii nevajadzeetu bremzeet ja vien id un field ir indeksi .. shis query ir liikaaks par liiku ... INSERT INTO table SET field = 'value' (varbuut tu domaaji: update table set field='value' where id=1) Link to comment Share on other sites More sharing options...
andrisp Posted July 9, 2008 Report Share Posted July 9, 2008 Klez, MySQL piedāvā tādu insertošanas sintaki. Kāpēc gan neizmantot, ja piedāvā ? :) Diskusijas par šo te jau ir bijušas. Link to comment Share on other sites More sharing options...
martins256 Posted July 9, 2008 Report Share Posted July 9, 2008 nevar kkā šitā: "IF((SELECT COUNT(*) FROM FROM table WHERE id = 1 AND field = 'value') =0,INSERT INTO table SET field = 'value')" Link to comment Share on other sites More sharing options...
codez Posted July 9, 2008 Report Share Posted July 9, 2008 (edited) Iespējams, tev vajadzīgs šis: http://dev.mysql.com/doc/refman/5.0/en/ins...-duplicate.html vai arī šāds variants: INSERT IGNORE INTO table (id,field) VALUES (1,'value'); Edited July 9, 2008 by codez Link to comment Share on other sites More sharing options...
Klez Posted July 9, 2008 Report Share Posted July 9, 2008 paskatiijos , vienk nekur taadu nebiju redzeejis .. ka kaads izmantotu ... Link to comment Share on other sites More sharing options...
Paulinjsh Posted July 9, 2008 Report Share Posted July 9, 2008 klez, lietoju tādu, tīri parocīgi. Link to comment Share on other sites More sharing options...
Gints Plivna Posted July 9, 2008 Report Share Posted July 9, 2008 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 More sharing options...
Recommended Posts