0

我检查了以前的帖子,但没有一个解决我的问题,任何帮助将不胜感激

MYSQL 查询 3 个表(用户、匹配、面试)

想要返回指定 Match 的用户名和采访号(如果有采访号)。

但我不想将结果仅限于接受采访的用户。我尝试了 JOIN,但无法让它为 3 个表工作。

这是我到目前为止在 PHP 中的内容:

$query = "SELECT CONCAT(u.first_name,' ',u.last_name,'----',COALESCE(i.v_code,'')) as name, u.id as id
FROM #__users as u

 JOIN #__bl_match as m ON ( (u.team_id = m.team1_id) OR 
     (u.team_id = m.team2_id) OR 
     (u.team_id = m.team3_id AND m.team3_id != 0) OR 
     (u.team_id = m.team4_id AND m.team4_id != 0) OR 
     (u.team_id = m.team5_id AND m.team5_id != 0) OR 
     (u.team_id = m.team6_id AND m.team6_id != 0) OR
     (u.team_id = m.team7_id AND m.team7_id != 0) OR
     (u.team_id = m.team8_id AND m.team8_id != 0) OR 
     (u.team_id = m.team9_id AND m.team9_id != 0) OR
     (u.team_id = m.team10_id AND m.team10_id != 0)) 
   AND m.id = ".$t_id."AND m.id != 0 

JOIN #__bl_interview as i ON i.u_id = u.id";

        $db->setQuery($query);
    $parti12 = $db->loadObjectList();
4

1 回答 1

0

如果您想要没有采访的用户,您需要对采访表使用 LEFT JOIN,但这意味着该用户的采访编号将为 NULL。

由于您将数字与 SELECT 列表中的用户名连接起来,因此当他们没有接受采访时,这会导致用户名返回为 NULL(因为将字符串与 NULL 值连接 - 或执行几乎任何其他操作在 NULL 值上 - 产生 NULL 结果)。

为避免这种情况,您必须处理i.v_code为 NULL 时的情况。在 MySQL 中执行此操作的典型方法是使用COALESCE 函数

SELECT CONCAT(u.first_name, ' ', u.last_name, '----', COALESCE(i.v_code,'')) as name, 
       u.id as id
FROM #__users as u
JOIN #__bl_match as m ON ( (u.team_id = m.team1_id) OR 
     (u.team_id = m.team2_id) OR 
     (u.team_id = m.team3_id AND m.team3_id != 0) OR 
     (u.team_id = m.team4_id AND m.team4_id != 0) OR 
     (u.team_id = m.team5_id AND m.team5_id != 0) OR 
     (u.team_id = m.team6_id AND m.team6_id != 0) OR
     (u.team_id = m.team7_id AND m.team7_id != 0) OR
     (u.team_id = m.team8_id AND m.team8_id != 0) OR 
     (u.team_id = m.team9_id AND m.team9_id != 0) OR
     (u.team_id = m.team10_id AND m.team10_id != 0)) 
   AND m.id = ".$t_id."AND m.id != 0 
LEFT JOIN #__bl_interview as i ON i.u_id = u.id"

现在,鉴于您应用到名称的格式,您可能会----在名称后留下无关紧要的内容,没有后续的采访代码。如果您想避免这种情况,我们可以使用IF而不是 COALESCE 来使我们的输出更智能,如下所示:

SELECT CONCAT(u.first_name, ' ', u.last_name, IF(i.v_code, '---- ' + i.v_code, '')) as name

请注意这是在做什么:如果i.v_code不是 NULL,则 IF 中的第一个表达式的计算结果为 true,因此返回第二个表达式。否则,返回第三个表达式(空字符串) - 因此当i.v_code为 NULL 时,您只输出用户名。

于 2012-09-20T23:17:56.480 回答