Как создать процедуру, которая выполняет аналогичную работу с моей php-функцией (ускорение оптимизации)

Я получил таблицу, как показано ниже.

mysql> select * from dts; +----+------+------+--------+------+------+------+------+------+ | Id | key1 | key2 | serial | pr1 | pr2 | pr3 | pr4 | pr5 | +----+------+------+--------+------+------+------+------+------+ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 2 | | 2 | 1 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | | 3 | 1 | 1 | 3 | 0 | 0 | 0 | 1 | 0 | | 4 | 1 | 1 | 4 | 1 | 0 | 1 | 1 | 3 | | 5 | 1 | 2 | 5 | 0 | 0 | 0 | 2 | 5 | | 6 | 1 | 2 | 6 | 0 | 0 | 0 | 0 | 1 | | 7 | 1 | 2 | 7 | 0 | 1 | 0 | 0 | 0 | | 8 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 2 | | 9 | 2 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | | 10 | 3 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | | 11 | 3 | 3 | 1 | 1 | 1 | 0 | 0 | 1 | | 12 | 3 | 3 | 5 | 0 | 0 | 1 | 1 | 0 | +----+------+------+--------+------+------+------+------+------+ 12 rows in set (0.00 sec) 

Я хотел бы передать key1, key2, db, таблицу и список полей, разделенных запятыми процедуре, и хотел бы искать ненулевые значения из этих полей для записей, возвращаемых оператором select, если предполагается, если я получу все поля, которые являются отличные от нуля, только цикл break и возвращаемая строка обратно.

То, что я пробовал, ниже, используя php

 function show_available($key1, $key2, $db, $table, $conn, $fields=null) { /* Select all fields in argument from db table where key... */ $query = "select ".$fields." FROM $db.$table where key1=$key1 and key2=$key2"; /* Query */ $result = $conn->query($query , MYSQLI_USE_RESULT); /* Output array */ $out = array(); while($row=$result->fetch_assoc()) { /* Loop through fields */ foreach($row as $key => $val) { /* If val is greater than 0*/ if($val > 0 ){ /*Ok we got field which has value greater than 0*/ $out[$key]=1; } } /* If all fields are found ok in so many records where key1=x and key2=x, break loop */ if(count($out) == count($field_arr))break; } /* Return which all fields has value greater than 0 */ return implode(',', array_keys($out)); } в function show_available($key1, $key2, $db, $table, $conn, $fields=null) { /* Select all fields in argument from db table where key... */ $query = "select ".$fields." FROM $db.$table where key1=$key1 and key2=$key2"; /* Query */ $result = $conn->query($query , MYSQLI_USE_RESULT); /* Output array */ $out = array(); while($row=$result->fetch_assoc()) { /* Loop through fields */ foreach($row as $key => $val) { /* If val is greater than 0*/ if($val > 0 ){ /*Ok we got field which has value greater than 0*/ $out[$key]=1; } } /* If all fields are found ok in so many records where key1=x and key2=x, break loop */ if(count($out) == count($field_arr))break; } /* Return which all fields has value greater than 0 */ return implode(',', array_keys($out)); } 

В той же функции я хотел бы преобразовать в процедуру для ускорения моей задачи и хочу иметь выход, как показано ниже, как это возможно, пожалуйста, помогите кому-нибудь

Если я someprocedure(1,1,db,table,'pr1,pr2,pr3,pr4,pr5') я бы хотел получить выходные данные pr1,pr3,pr4,pr5 потому что когда key1=1 и key2=1

 +----+------+------+--------+------+------+------+------+------+ | Id | key1 | key2 | serial | pr1 | pr2 | pr3 | pr4 | pr5 | +----+------+------+--------+------+------+------+------+------+ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 2 | - Found pr3,pr5 | 2 | 1 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | | 3 | 1 | 1 | 3 | 0 | 0 | 0 | 1 | 0 | - Found pr4 | 4 | 1 | 1 | 4 | 1 | 0 | 1 | 1 | 3 | - Found pr1 

Аналогично для key1 = 2 и key2 = 2

 | 8 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 2 | - Found pr1-pr5, break loop and return string | 9 | 2 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 

Ожидаемый результат

 # For procedure call expected o/p key1 key2 fields_non_zero 1 1 pr1,pr3,pr4,pr5 1 2 pr2,pr4,pr5 2 2 pr1,pr2,pr3,pr4,pr5 3 2 3 3 pr1,pr2,pr3,pr4,pr5 

столовый дамп

 DROP TABLE IF EXISTS `dts`; CREATE TABLE `dts` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `key1` int(11) DEFAULT '-99', `key2` int(11) DEFAULT '-99', `serial` int(11) DEFAULT '-99', `pr1` int(11) DEFAULT '-99', `pr2` int(11) DEFAULT '-99', `pr3` int(11) DEFAULT '-99', `pr4` int(11) DEFAULT '-99', `pr5` int(11) DEFAULT '-99', PRIMARY KEY (`Id`), KEY `main` (`key1`,`key2`,`serial`) ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1; LOCK TABLES `dts` WRITE; INSERT INTO `dts` VALUES (1,1,1,1,0,0,1,0,2),(2,1,1,2,0,0,0,0,0),(3,1,1,3,0,0,0,1,0),(4,1,1,4,1,0,1,1,3),(5,1,2,5,0,0,0,2,5),(6,1,2,6,0,0,0,0,1),(7,1,2,7,0,1,0,0,0),(8,2,2,1,1,1,1,1,2),(9,2,2,2,0,0,0,0,0),(10,3,2,3,0,0,0,0,0),(11,3,3,1,1,1,0,0,1),(12,3,3,5,0,0,1,1,0); UNLOCK TABLES;