[英]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.