如何根据第一个表中的值继续加入另一个表?

时间:2011-07-26 20:31:11

标签: mysql sql sql-server

我尝试使用case作为join_id创建临时列,但是当我尝试将连接添加到它上面时,它表示该列不存在

SELECT * , se_users.user_username,
CASE se_album_keys.key_owner_id
WHEN 28 THEN se_album_keys.key_user_id
ELSE se_album_keys.key_owner_id
END  AS key_join_id
FROM se_album_keys
LEFT JOIN se_users ON se_users.user_id=se_album_keys.key_join_id
LIMIT 10;

错误:

ERROR 1054 (42S22): Unknown column 'se_album_keys.key_join_id' in 'on clause'

更新 使用 IF()很难找到答案,因为TehShrike建议的索引无法使用,但是他在聊天室中建议solution for joining table by condition之后。我意识到我过度分析了整个情况并提出了这个问题:

  SELECT se_album_keys.* FROM  se_album_keys 
  LEFT JOIN se_users AS users_see_mine ON se_album_keys.key_owner_id = 28 AND users_see_mine.user_id = se_album_keys.key_user_id 
LEFT JOIN se_users AS users_i_see ON se_album_keys.key_owner_id != 28 AND users_i_see.user_id = se_album_keys.key_owner_id
WHERE se_album_keys.key_user_id=28 OR se_album_keys.key_owner_id=28;

所以我会暂时搁置这个问题,看看专家是否有话要说。我已经完成了这个编码,并且只对了解有关高性能mysql的更多信息感兴趣!

2 个答案:

答案 0 :(得分:2)

您可以在联接中使用IF():

LEFT JOIN users ON users.user_id = IF(album_keys.key_owner_id = 1337, 
  album_keys.key_user_id, album_keys.key_owner_id) 

但请注意,将不会使用album_keys表中的索引!

编辑:如果你两次加入另一个表,你可以使用COALESCE()之类的函数来显示相关的表:

LEFT JOIN users AS users_see_mine ON album_keys.key_owner_id = 1337 
  AND users_see_mine.user_id = album_keys.key_user_id 
LEFT JOIN users AS users_i_see ON album_keys.key_owner_id != 1337 
  AND users_i_see.user_id = album_keys.key_owner_id

答案 1 :(得分:2)

使用UNION或UNION ALL。

SELECT  *,
        se_users.user_username
  FROM  se_album_keys
        LEFT JOIN 
        se_users 
        ON se_users.user_id = se_album_keys.key_user_id
 WHERE  se_album_keys.key_owner_id = 28

UNION ALL

SELECT  *,
        se_users.user_username
  FROM  se_album_keys
        LEFT JOIN 
        se_users 
        ON se_users.user_id = se_album_keys.key_owner_id
  WHERE se_album_keys.key_owner_id <> 28