我只是从几张表中获取用户数据,但用户可以选择添加多个技能或exp。
$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
答案 0 :(得分: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;
答案 1 :(得分:1)
我不确定该怎么做,但你可以尝试一些事情。您可以设置两个不同的子查询来创建额外的字段,但这可能会为您创建不必要的字段。另一件事是从其他表中连接结果并使用它。您也可以订购它们并检查是否与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
很抱歉,我无法测试它是否有效,但如果您需要,可以调整分隔符。我不确定如果没有匹配的记录会如何反应,但我认为它只会返回一个空字符串或空字符串,但你可能需要检查。
......他们可能不得不进入select
而不是from
,但我不确定。你将不得不玩它,看看哪些有效,哪些更快。
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
条件),这应该更快,因为我认为子查询创建临时表并且只运行一次。
..如果您一次只查询一行,那么只需将条件粘贴在子查询上即可。