Php 双项Mysql查询和foreach查询

Php 双项Mysql查询和foreach查询,php,mysql,codeigniter,join,codeigniter-2,Php,Mysql,Codeigniter,Join,Codeigniter 2,我只是从几个表中获取用户数据,但用户可以选择添加多个技能或经验 $query_str = "SELECT a.*, b.*, c.*, d.*, e.* FROM edu a JOIN exp b ON a.user_id=b.user_id JOIN user_profiles c ON a.user_id=c.user_id JOIN skills d ON a.user_id=d.user_id

我只是从几个表中获取用户数据,但用户可以选择添加多个技能或经验

$query_str = "SELECT a.*, b.*, c.*, d.*, e.* FROM edu a
              JOIN exp b ON a.user_id=b.user_id
              JOIN user_profiles c ON a.user_id=c.user_id
              JOIN skills d ON a.user_id=d.user_id
              JOIN comp e ON a.user_id=e.user_id
              WHERE a.user_id = ?";

$query = $this->db->query($query_str, $end_user);
            if($query->num_rows() > 0) {
                    foreach($query->result_array() as $stuff) {
                            $data[] = $stuff;
                    }
                    return $data;
                    } else {
            return false;
                    }
在我尝试显示数据之前,一切都很好。如果一个用户有两个exp,那么其他所有内容都会显示两次。我不知道该怎么写。把它们分开比较容易吗?每个项目一个查询

public function get_education()
    {
           $one_edu = $this->test_model->one_edu($end_user);
            if ($one_edu != false)
            {
                    foreach($one_edu as $edas) {
                            $one_edu_html .='<p>'.$edas['objective'].'</p>';
                    }

                    foreach($one_edu as $exp) {
                            $one_edu_html .= '<p>'.$exp['exp_title'].'</p>';

                    }

                    foreach($one_edu as $educ) {
                            $one_edu_html .= '<p>'.$educ['edu_title'].'</p>';
                    }

                    $result = array('status' => 'ok', 'content' => $one_edu_html);
                    echo json_encode($result);
                    exit();
            }else{
                    $result = array('status' => 'ok', 'content' => '');
                    echo json_encode($result);
                    exit();
            }
    }
get_education()公共功能
{
$one_edu=$this->test_model->one_edu($end_user);
如果($one_edu!=false)
{
foreach($EDA作为$EDA){
$one_edu_html.=''.$edas['objective'.

'; } foreach($1_edu作为$exp){ $one_edu_html.=''.$exp['exp_title'..

'; } foreach($1_edu作为$educ){ $one_edu_html.=''.$educ['edu_title'].

'; } $result=array('status'=>'ok','content'=>$one\u edu\u html); echo json_编码($result); 退出(); }否则{ $result=array('status'=>'ok','content'=>''); echo json_编码($result); 退出(); } }
现在它返回类似这样的内容:

Objective
Exp title1
Exp title2
Edu title
Edu title <- Extra
目标
实验标题1
实验标题2
教育单位名称

Edu title我不确定该怎么做,但你可以试试看。您可以设置两个不同的子查询来创建额外的字段,但这可能会为您创建不必要的字段。另一件事是从其他表中提取结果并使用它。您也可以直接订购它们,然后用php检查是否有重复的。无论哪种方式,小组会议可能是你正在寻找的

我不确定结构和您需要什么,但假设您需要技能中的2个字段和经验中的1个字段:

SELECT a.*, b.*, c.*, d.*, e.*
    FROM edu a,
      (SELECT GROUP_CONCAT(s.F1) as d_f1, GROUP_CONCAT(s.F2) as d_f2
       FROM skills s
       WHERE a.user_id=s.user_id
       GROUP BY s.user_id) d,
      (SELECT GROUP_CONCAT(t.F1) as e_f1
       FROM exp t
       WHERE a.user_id=t.user_id
       GROUP BY t.user_id) e
    JOIN user_profiles b ON a.user_id=b.user_id
    JOIN comp c ON a.user_id=c.user_id
    WHERE a.user_id = ?

很抱歉,我无法测试它是否工作,但如果需要,您可以调整分离器和其他东西。如果没有匹配的记录,我不确定它会如何反应,但我假设它只会返回一个null或空字符串,但您可能必须进行检查

。。。他们可能必须进入
选择
,而不是从
进入
,但我不确定。你将不得不玩弄它,看看什么有效,什么更快

编辑:我开始在线测试(),这应该可以工作(假设我没有把语法搞砸):

如果您必须做很多事情(或者基本上删除
where
条件),那么这应该会更快,因为我认为子查询创建临时表,并且只运行一次


。。如果一次只查询一行,则只需将条件粘贴回子查询。

主要原因是您没有对行进行分组。在末尾添加一个石斑鱼,如
groupbya.id


更新 行是重复的,因为它们不同。您可以使用
group\u CONCAT

SELECT a.user_id, a.education, GROUP_CONCAT(a.edu_title SEPARATOR ",") "Edu_Title", GROUP_CONCAT(b.exp_title SEPARATOR ",") "Experience Title" ,b.experience, c.objective, d.skill, e.comp FROM edu a
JOIN exp b ON a.user_id=b.user_id
JOIN user_profiles c ON a.user_id=c.user_id
JOIN skills d ON a.user_id=d.user_id
JOIN comp e ON a.user_id=e.user_id
WHERE a.user_id = 243;

谢谢你的帮助。我会试试看。@ciprian您可能需要将userid放入子查询并加入其中或其他内容(但请确保仍按id分组),而不是为其选择。这可能会加快速度(我想),因为它可能只需要执行一个子查询。不确定你所说的“将用户ID放入子查询并连接到它或其他东西”是什么意思。该查询仍然返回重复项。我会继续努力的。谢谢。嗯,我想让搜索保持原样,简单地添加GroupBy可能会有用。。。它会自动创建新字段(用于多值字段)吗?还是您仍然需要告诉它对其进行连接(或其他组功能)?@craniumonempty您需要在必要的位置进行分组,并且可能会出现冗余字段。group BY不起作用。它没有显示多个字段。@ciprian,你能在sqlfiddle.com中创建数据库的模式吗?但是,接下来的两行有不同的教育背景,你想从这里得到什么
SELECT a.user_id, a.education, GROUP_CONCAT(a.edu_title SEPARATOR ",") "Edu_Title", GROUP_CONCAT(b.exp_title SEPARATOR ",") "Experience Title" ,b.experience, c.objective, d.skill, e.comp FROM edu a
JOIN exp b ON a.user_id=b.user_id
JOIN user_profiles c ON a.user_id=c.user_id
JOIN skills d ON a.user_id=d.user_id
JOIN comp e ON a.user_id=e.user_id
WHERE a.user_id = 243;