繁体   English   中英

Mysql案例语句语法

[英]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 tuser_id IS NOT NULL再加入adminbb u ON t .`admin_id”第3行

谢谢艾伦。

MySQL不支持条件连接表选择。 [1] [2]

选择[全部| 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM