【问题标题】:Mysql query and foreach query with double itemsMysql查询和foreach查询带有双项
【发布时间】:2012-04-20 21:27:09
【问题描述】:

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

$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

使用codeigniter

【问题讨论】:

    标签: php mysql codeigniter join codeigniter-2


    【解决方案1】:

    主要原因是您没有对行进行分组。添加石斑鱼,如GROUP BY a.id在末尾​​p>


    更新

    行是重复的,因为它们是不同的,您可以使用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;
    

    Demo

    【讨论】:

    • 嗯,我想保持搜索不变并简单地添加 group by 可能会起作用......它会自动创建新字段(对于多值字段)还是你仍然需要告诉它连接它们(或其他组功能)?
    • @craniumonempty 您需要在必要和可能到达的地方进行分组。
    • GROUP BY 不起作用。它没有显示它应该显示的多个字段。
    • @ciprian,您可以在 sqlfiddle.com 中创建数据库架构吗?
    • 但是,即将到来的两排教育程度不同,这里想达到什么目的
    【解决方案2】:

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

    我不确定结构和您需要什么,但假设您需要 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 条件),那应该会更快,因为我认为子查询会创建临时表并且只运行一次。

    .. 如果您一次只查询一行,那么只需将条件返回到子查询。

    【讨论】:

    • 感谢您的帮助。我会试试看。
    • @ciprian 您可能需要将用户 ID 放在子查询中并加入它或其他东西(但请确保您仍然按 ID 分组)而不是选择它。这可能会加快速度(我认为),因为它可能只需要执行一个子查询。
    • 嗨。不确定“将用户标识放在子查询中并加入它或其他东西”是什么意思。查询仍然返回重复项。我会继续努力。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 2020-10-22
    • 1970-01-01
    • 2020-05-11
    • 2014-01-31
    • 1970-01-01
    • 2012-07-20
    • 2013-01-04
    相关资源
    最近更新 更多