【发布时间】:2012-02-07 06:08:28
【问题描述】:
我的 php 应用程序上有一个用户列表(使用 codeigniter)。每个用户可能已经完成了一个包含大约 1000 个左右字段的表单。结构看起来类似于这样:
用户
id|username|...
completed_form_fields
id|formid|userid|fieldkey|data
其中字段键只是该特定表单字段的唯一键,即:“first_name”
我有一个用户搜索页面,人们可以通过他们选择的字段(眼睛颜色、种族、性别......)过滤掉特定用户然后我需要显示这些字段,以便我喜欢(并且目前有)输出像这样:
$filteredmembers = array(
[0] = Object(
[id] => 1
[username] => kilrizzy
...
[fields] => Array(
[fname] => Jeff
[gender] => Male
...
目前我的脚本显然要花很长时间,因为我查询了所有填写此表单的成员,然后遍历每个成员以查询他们的所有字段。然后根据条件+页面/偏移量过滤掉那些。
我知道需要有一种方法可以在一个我不熟悉的查询中将它们连接在一起
我的非常慢的代码的简化版:
function get_members(){
$this->db->select('u.*');
$this->db->from('users AS u');
$query = $this->db->get();
if ($query->num_rows() > 0){
$members = $query->result();
//Get fields from each user
foreach($members as $mk => $mv){
$fields = $this->get_form_fields($mv->id,1,true);
$members[$mk]->fields = $fields;
}
return $members;
}else{
return false;
}
}
function get_form_fields($uid,$form,$values=false){
$this->db->where('user', $uid);
$this->db->where('form', $form);
$query = $this->db->get('form_fields');
if ($query->num_rows() > 0){
$result = $query->result();
return $result;
}else{
return false;
}
}
【问题讨论】:
-
您的过滤条件应该是 WHERE 子句的一部分,该子句是根据 completed_form_fields 表中的信息动态构建的。我无法想象您在尝试什么,但您可能还需要在 users 和 completed_form_fields 表之间进行 INNER JOIN。
-
@bfavaretto - 添加了我的查询示例
标签: php mysql codeigniter join