簡體   English   中英

Mysql 查詢和帶有雙項的 foreach 查詢

[英]Mysql query and foreach query with double items

我只是從幾個表中獲取用戶數據,但用戶可以選擇添加不止一項技能或經驗。

$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

這樣做的主要原因是您沒有對行進行分組。 添加一個石斑魚,比如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;

演示

我不確定具體怎么做,但你可以嘗試一些事情。 您可以設置兩個不同的子查詢來創建額外的字段,但這可能會為您創建不必要的字段。 另一件事是連接其他表的結果並使用它。 您也可以只訂購它們並檢查是否與 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 或空字符串,但您可能需要檢查一下。

...他們可能必須 go 到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條件),那應該會更快,因為我認為子查詢創建臨時表並且只運行一次。

.. 如果您一次只查詢一行,那么只需將條件粘貼回子查詢即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM