这是您的架构和数据。 http://www.sqlfiddle.com/#!2/7af94/1
如果您在 sqlfiddle 中发布您的数据,我们将不胜感激。
我觉得要匹配老师的名字和昵称,你应该去掉GROUP_CONCAT()
就像这样:
SELECT name_course, t.name_teacher AS teachers,
u.nickname_user AS nickname
FROM courses c
LEFT JOIN teachers t ON t.id_course_teacher=c.id_course
LEFT JOIN users u ON t.id_user_teacher=u.id_user
WHERE c.id_course='c1';
+-------------+----------+-------------+
| name_course | teachers | nickname |
+-------------+----------+-------------+
| c_name1 | t1_name | u1_nickname |
| c_name1 | t2_name | u2_nickname |
| c_name1 | t3_name | NULL |
+-------------+----------+-------------+
假设多对多关系,我猜你的数据库设计不是标准化的。
当教师和课程有多对多关系时,teacher_to_course 表是必需的。
courses_to_teachers(id_course, id_teacher)
SELECT name_course, t.name_teacher AS teachers,
u.nickname_user AS nickname
FROM courses c
LEFT JOIN course_to_teachers ct ON c.id_course = ct.id_course
LEFT JOIN teachers t ON t.id_teacher = ct.id_teacher
LEFT JOIN users u ON t.id_user_teacher=u.id_user
WHERE c.id_course='c1';
更新
“我用php展示课程,所以可以创建一个数组array[t1_name=>u1_nickname, t2_name=>u2_nickname, etc...)?”
意思是,您正在使用GROUP_CONCAT() 来简化这样的数组?我认为没有GROUP_CONCAT()也可以制作。
无论如何,如果您需要GROUP_CONCAT() 为什么不试试这个? (你可以在这里测试http://www.sqlfiddle.com/#!2/7af94/24/0)
SELECT name_course, GROUP_CONCAT(CONCAT(t.name_teacher, ':', IF(u.nickname_user IS NULL, 'NULL', u.nickname_user))) AS name_nick_map
FROM courses c
LEFT JOIN teachers t ON t.id_course_teacher=c.id_course
LEFT JOIN users u ON t.id_user_teacher=u.id_user
WHERE c.id_course='c1'
GROUP BY name_course;
+-------------+------------------------------------------------------+
| name_course | name_nick_map |
+-------------+------------------------------------------------------+
| c_name1 | t1_name:u1_nickname,t2_name:u2_nickname,t3_name:NULL |
+-------------+------------------------------------------------------+
如您所见,"t3_name:NULL" 代表"t3_name has no nickname"
制作数组
我想知道你是不是在问这个代码。有以下查询和结果。
SELECT name_course, t.name_teacher AS teacher, u.nickname_user AS nickname
FROM courses c
LEFT JOIN teachers t ON t.id_course_teacher=c.id_course
LEFT JOIN users u ON t.id_user_teacher=u.id_user
WHERE c.id_course='c1';
+-------------+----------+-------------+
| name_course | teacher | nickname |
+-------------+----------+-------------+
| c_name1 | t1_name | u1_nickname |
| c_name1 | t2_name | u2_nickname |
| c_name1 | t3_name | NULL |
+-------------+----------+-------------+
制作数组。
$query = "SELECT ....";
$result = mysqli_query($query);
// error handling omitted
$CONTAINER = Array();
while ($row = mysqli_fetch_assoc($result))
{
$CONTAINER[$row['teacher']] = $row['nickname'];
}
print_r($CONTAINER);
mysqli_free_result($result);
可能print_r($CONTAINER) 会产生类似"array[t1_name=>u1_nickname, t2_name=>u2_nickname, etc...)" 的东西