我尝试使用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的更多信息感兴趣!
答案 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