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;
                    }

データを表示しようとするまで、すべて問題ありません。ユーザーが 2 つの exp を持っている場合、他のすべてが 2 回表示されます。これを書く方法がわかりません。それらを分離した方が簡単でしょうか?アイテムごとに 1 つのクエリ?

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

正確な方法はわかりませんが、いくつか試してみることができます。追加のフィールドを作成する2つの異なるサブクエリを設定できますが、それによって不要なフィールドが作成される可能性があります。もう1つは、他のテーブルの結果を連結して使用することです。それらを注文して、phpで重複していないかどうかを確認することもできます。いずれにせよ、group_concatはおそらくあなたが探しているものです。

構造と必要なものがわかりませんが、スキルから2つのフィールド、expから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 = ?

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サブクエリは一時テーブルを作成し、1回だけ実行されると思うので、多くのことを行う(または基本的に条件を削除する)必要がある場合は、これはより高速です。

..一度に1行だけクエリを実行する場合は、条件をサブクエリに戻すだけです。

于 2012-04-07T20:25:54.853 に答える