[英]Mysql Case Statement syntax
任何人都可以告诉我这里的语法恐怖:
SELECT `t`.*, `u`.`first_name`, `u`.`second_name`
FROM `tickets` `t`
(CASE WHEN `t`.`user_id` IS NOT NULL
THEN
JOIN `adminbb` `u` ON `t`.`admin_id`=`u`.`admin_id`
ELSE
JOIN `users` `u` ON `t`.`user_id`=`u`.`user_id`
END)
WHERE `t`.`ticket_id` =1
ORDER BY `t`.`ticketText_id`
LIMIT 0,3
错误说:您的SQL语法有错误; 检查对应于你的MySQL服务器版本正确的语法使用附近的手册“(CASE WHEN t
。 user_id
IS NOT NULL再加入adminbb
u
ON t
.`admin_id”第3行
谢谢艾伦。
选择[全部| DISTINCT | DISTINCTROW] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [,select_expr ...] [FROM table_references ...
并且没有像CASE
这样的复杂表达式定义表引用。
您可以使用:
SELECT IF(t.user_id IS NULL, a.user_id, u.user_id) AS user_id, ...
FROM ...
JOIN `adminbb` `a` ON `t`.`admin_id`=`u`.`admin_id`
JOIN `users` `u` ON `t`.`user_id`=`u`.`user_id`
一旦你概念化了你要求服务器做什么,这在MySQL中并不难实现。
我已针对t.user_id撤消了IS NOT NULL
测试,因为原始case语句似乎是倒退的,当t.user_id不为null时加入admin并且当t.user_id为null时加入用户,这似乎是不可能的。 除此之外,这里是一个查询,通过在可能的情况下加入用户来获取first_name和second_name,否则加入admin。 连接是LEFT
连接,因为我们需要从'ticket'返回行,而不管哪个表是可连接的。
SELECT t.*,
COALESCE(u.first_name,a.first_name) as first_name,
COALESCE(u.second_name,a.second_name) as second_name
FROM `tickets` `t`
LEFT JOIN `users` `u` ON `t`.`user_id`=`u`.`user_id`
LEFT JOIN `adminbb` `a` ON `t`.`admin_id`=`a`.`admin_id` AND t.user_id IS NULL
WHERE `t`.`ticket_id` =1
ORDER BY `t`.`ticketText_id`
LIMIT 0,3;
COALESCE()
函数从其参数中返回最左边的非空值。
LEFT JOIN用户将从“u”中获取值(如果它们存在且t.user_id不为null),并且仅当t.user_id为null时,LEFT JOIN adminbb将查找“a”中的值。
ON
子句中的条件只需要是可测试的表达式,它们实际上不必是“关于”您加入的表。 在针对adminbb的连接的情况下,新的连接条件实际上是关于左边的表而不是右边的表,但是这仍然是非常合法的,并且仍然会阻止在不需要时尝试连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.