1

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

$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();
            }
    }

现在它返回如下内容:

Objective
Exp title1
Exp title2
Edu title
Edu title <- Extra

使用代码点火器

4

2 回答 2

2

主要原因是您没有对行进行分组。添加石斑鱼,就像 GROUP BY a.id最后一样


更新

行是重复的,因为它们是不同的,您可以将字段分组到单行上,使用GROUP_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;

演示

于 2012-04-07T21:44:47.213 回答
1

我不确定到底该怎么做,但你可以尝试一些事情。您可以设置两个不同的子查询来创建额外的字段,但这可能会为您创建不必要的字段。另一件事是连接其他表的结果并使用它。您也可以只订购它们并使用 php 检查是否重复。无论哪种方式, group_concat 都可能是您正在寻找的。

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

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 = ?

http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_group-concat

抱歉,我无法测试它是否有效,但您可以根据需要调整分隔符和其他内容。我不确定如果没有匹配的记录它会如何反应,但我认为它只会返回一个 null 或空字符串,但您可能需要检查。

...他们可能不得不进入select而不是进入from,但我不确定。您将不得不使用它,看看哪些有效,哪些更快。

编辑:我必须在线测试(http://demo.phpmyadmin.net/),这应该可以工作(假设我没有搞砸语法):

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

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

.. 如果您一次只查询一行,那么只需将条件重新粘贴到子查询上。

于 2012-04-07T20:25:54.853 回答