Jump to content
php.lv forumi

Elastīgā datu atlase no MySQL


Cibiņš

Recommended Posts

Veidoju droplistu sarakstu meklēšanas kritērijiem:

 

Ir sekojošie lauki:

 

Research - droplist - $pat_rsrch;

Date -FROM - $date1 un UNTIL $date2 ;

User - droplist - $pat_usr;

Patient ID droplist - $pat_ptid;

Site ID droplist - $pat_std;

 

BET - pašlaik ir jautājums - kā izveidot kvēriju lai meklēšana notiek piemērampēc viena vai vairākiem kritērijiem, ja pārējie lauki ir uzsetoti uz ALL, kur uz ALL padošanu atlasa visus ierakstus vai ja padod gan tukšu lauku datumos un ALL uz droplistiem lai atlasa PILNĪGI visus ierakstus??

 

 

Pašreizējais kvērijs kas atlasa ierakstus pēc visiem nosacījumiem:

 

$rcrds = mysql_query("SELECT * FROM log WHERE research_id='$pat_rsrch' AND user_id='$pat_usr' AND patient_id='$pat_ptid' AND site_id='$pat_std' AND date >= '".$date1."' AND date <= '".$date2."'")or die(mysql_error());

Edited by Cibiņš
Link to comment
Share on other sites

Interesanti, ka neatradu tādu jauku apkopojošu rakstu ar paskaidrojošiem argumentiem kā un kāpēc eleganti to darīt MySQLā. Es zinu kā to darīt labi un pareizi iekš SQL Server un Oracle (un ir raksti par to), bet cik es saprotu, tad MySQLā īsti nav tāda lieta kā kopējs query kešs ko šārē vairākas konekcijas, līdz ar to var rīkoties, kā teica waplet.

- Ir SELECT daļa, kas visiem vienāda,

- ir join daļa, ko papildina tad, ja ir netukši kritēriji no citām tabulām, ja kritēriji tikai vienai tabulai tad tādu nevajag

- ir where klauza, kuru dinamiski papildina, ja kāds no kritērijiem ir netukšs, lai nebūt jāsatraucās vai pirms tam kāds kritērijs ir bijis vai nē, tad sākumā where klauza = 'WHERE 1 = 1 ' un pēc tam tik netukšajiem kritērijiem met klāt ' AND kolona = $vērtība'

- ir order by klauza, kura, ja nevar izvēlēties dinamiski vienmēr ir viena.

Tātad mīnuss it kā ir tas, ka katru reizi vaicājumu parsē atkal un atkal, bet nezinu kā to īsti tur risina, un, ja lietotāju nav mega daudz, tad par to var neuztraukties.

 

Pāris relatīvi jēdzīgas tēmas par to pašu problēmu bija šeit:

http://stackoverflow.com/questions/7476611/how-to-write-a-query-with-a-dynamic-where-clause

http://forums.mysql.com/read.php?52,430828,430945#msg-430945

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

Varbūt jāsāk ar programmēšanas pamatu apgūšanu, piemēram, stringu konkatēšanu?

Konkatenēšana. Concat ir saīsinājums no concatenate. Bet vispār, [teksta] virkņu savienošana.

 

 

Nu tad tur jāliek da*uja ifi un elši..kautkādu vienkāršāku paņēmienu vaig..

Krievi glabā pazemē lielus pārtikas krājumus un veic misijas uz marsa... Tas viss tāpēc, ka zemei uz īsu brīdi pietuvosies planēta, kurā pilnīgi viss būs vienkārši!

 

Ja nopietni, kā tad tu domāji, ka ir kāds maģiskais risinājums?

 

p.s. Kādreiz tiku tādu taisījis, tieši tā, kā Gints aprakstīja.

Edited by Mr.Key
Link to comment
Share on other sites

Ja tev nepatīk daudz ifi, tad vari mēģināt taisīt izvirtības! piemēram:

$where = ' 1=1';
$query_fields = array('pat_rsrch'=>'research_id','date1'=>'date','date2'=>'date','pat_usr'=>'user_id','pat_ptid'=>'patient_id','pat_std'=>'site_id');
foreach($query_fields as $value=>$field){
if(!empty($$value)){
   	$where.=" AND `{$field}` = '{$$value}'";
}
}
$rcrds = mysql_query("SELECT * FROM log WHERE {$where}")or die(mysql_error());

Par sintaksi nevaru garantēt, bet ideja ir aprakstīt visus php mainīgos un norādīt mysql kolonu. Pēc tam ciklā vienkārši pārbauda vai šī vērtība ir uzsetota un ja ir, tad pieliek where nosacījumu.

 

Uzmanību, piemēram $pat_rsrch = 0 tiks uzskatīts par neeksistējošu vērtību!

Edited by draugz
Link to comment
Share on other sites

Šeit, jau netika jautāts kā būtu labāk :) cilvēks, gribēja sev sarežģīt dzīvi :) Savām vajadzībām, ja nu ko līdzīgu izmantotu, tad tikai lai no $_POST vai $_GET ielasītu pa tiešu un tajā pašā vietā arī escape uztaisītu.

Link to comment
Share on other sites

Kohanai (atkal, jā) ir tāda lieta kā Query Builder.

 

Tad var iztikt par bez stringu savbienošanas:

 

 

$query = DB::select('a', 'b')->from('x');

if (!empty($y)) {

   $query->where('y', '=', $y);

} else if (!empty($z)) {

   $query->where('z', 'LIKE', $z);

}

$result = $query->execute()->as_array();

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...