Mysql 在SQL中使用IF/CASE条件
关于如何在SQL中使用IF语句,我有一个问题,因此我有3个表Mysql 在SQL中使用IF/CASE条件,mysql,sql,Mysql,Sql,关于如何在SQL中使用IF语句,我有一个问题,因此我有3个表 使用者 力学 交换 每个表中的字段如下所示 user mechanics exchanges ------ ---------- --------- name name id_user id_user id_mecha id_mecha message 我想使用如下条件
- 使用者
- 力学
- 交换
user mechanics exchanges
------ ---------- ---------
name name id_user
id_user id_mecha id_mecha
message
我想使用如下条件,其中我将选择用户
或技工
的名称及其相应的消息
,如果他们的id
与交换
为他们中的每一个人(用户
或技工
)匹配
如果我理解正确,您需要
结束中的选择
,并且您需要为加入打开,如下所示
SELECT CASE
WHEN mechanics.id_mecha = exchanges.id_mecha THEN mechanics.name
WHEN users.id_user = exchanges.id_user THEN users.name
END,
exchanges.message
FROM users u
JOIN mechanics m ON users.id_user = exchanges.id_user
JOIN exchanges e ON mechanics.id_mecha = exchanges.id_mecha
事实上,您需要一个带有case
语句的JOIN
(假设一条特定消息只能针对某个用户或某个特定的技工,而不能同时针对两个用户或技工):
双重连接将在机械师和用户之间产生完全的交叉积。这可能不是你想要的。您应该对每个表使用一个联接,然后将它们与UNION
组合
SELECT m.name, e.message
FROM mechanics AS m
JOIN exchanges AS e ON m.id_mecha = e.id_mecha
UNION
SELECT u.name, e.message
FROM users AS u
JOIN exchanges AS e ON m.id_user = e.id_user
您缺少CASE
@Barmar的END
关键字,哦,是的,很抱歉,谢谢您的评论。答案经过编辑。你是对的,我不希望机械师和用户之间有一个完全的交叉产品,所以这个联盟对我来说很好,非常感谢。
SELECT case
when e.id_user is null then m.name
when e.id_mecha is null then u.name
else null end,
e.message
from exchanges e join users u on e.id_user=u.id_user
join mechanics m on e.id_mecha=m.id_mecha
SELECT m.name, e.message
FROM mechanics AS m
JOIN exchanges AS e ON m.id_mecha = e.id_mecha
UNION
SELECT u.name, e.message
FROM users AS u
JOIN exchanges AS e ON m.id_user = e.id_user