我正在网站上工作,我需要用类别填充一些字段,所以现在我多次查询数据库:
$dataCat=new database_data();
$a=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('1'));
$b=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('2'));
$c=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('3'));
$d=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('4'));
$e=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('5'));
我按预期获得所有内容然后使用复选框,无线电,选择等上的值,例如:
echo '<select><option value="">tipo de inmueble</option>';
foreach($b as $x){
echo '<option value="'.$x['id'].'">'.ucwords($x['name']).'</option>';
}
echo '</select>';
在1页面上我需要填充超过5个字段,在我看来,多次查询不是可行的方法,所以我继续尝试了一些不同的查询:
SELECT value, json_agg(id || ',' || name), json_agg(concat(id,' => ',quote_literal(name))) FROM categories.categories WHERE categories.value != 'null' GROUP BY value ORDER BY value ASC
我的目标是获取带有数组的表,但填充我需要它的字段是一件痛苦的事情,我对分层查询很难,但我无法想象如何将部分结果用于我需要的部分。假设我从查询中获得了30个结果,如何使用前3行填充第一个表单元素,然后使用另一部分填充第二个表单元素,依此类推。
我的问题:可行吗?我应该坚持多个查询吗?会影响性能吗?还有另一种方法可以去吗?
提前感谢任何指示。
更新
好的,我现在正在使用它,这是查询:
$query=$dataCat->query_fecthAll("SELECT value,array_agg(id) as id,array_agg(name) as name FROM categories.categories WHERE categories.value != ? GROUP BY value ORDER BY value ASC",array('null'));
然后我用PHP处理结果,名称列有不同的长度,所以我循环了一下:
$strToRep=array('{','}');
for( $i= 0 ; $i < count($query) ; $i++ ){
//Clean the Array results
$cleanId=str_replace($strToRep,'',$query[$i]['id']);
$cleanName=str_replace($strToRep,'',$query[$i]['name']);
//Create Arrays for ID and Name
$a=explode(',',$cleanId);
$b=explode(',',$cleanName);
//Combine them into one array
$newArray[] = array_combine($a, $b);
//reorder the array in the desire way (alphabetical ASC by value)
asort($newArray[$i]);
};
//test it!
print_r($newArray);
//Use it!
echo '<select required><option value="">tipo de negociacion</option>';
foreach($newArray[0] as $key => $x){
echo '<option value="'.$key.'">'.ucwords($x).'</option>';
}
echo '</select>';
一切看起来都不错,现在我在chrome上进行了测试,我得到了这个(我不确定这是否是知道哪一个获得更好性能的最好方法,第一次在这里测试性能......):
答案 0 :(得分:4)
这是不好的做法,因为代码重复太多了。
如果这样做更快,那么进行多次查询是合理的,但通常情况并非如此。 (您需要使用相当大的数据集来衡量它),
您可以在查询后始终将数据分解为合适的块:
$elements = [1, 2, 3];
$result = $dataCat->query_fecthAll('SELECT name, value, id FROM categories.categories '
. 'WHERE categories.value IN (?' . str_repeat(', ?', count($elements) - 1)
. ') ORDER BY id ASC', $elements);
$fields = [];
foreach ($result as $item) {
$fields[$item['value']][] = $item;
}
// rendering elements could also be in a loop
// but you probably need more data for element i.e name, type, ...
foreach ($elements as $elem) {
echo renderElement($fields[$elem]);
}