Mysql案例语句语法

时间:2013-09-18 11:01:33

标签: mysql case

有人能告诉我这里的语法是什么:

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服务器版本相对应的手册,以便在'附近使用正确的语法'tuser_id IS NOT NULL,然后加入adminbb u ON {{ 1}}。第3行的`admin_id'

感谢Alan。

2 个答案:

答案 0 :(得分:1)

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`

答案 1 :(得分:1)

一旦你将你要求服务器做的事情概念化,这在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,则LEFT JOIN adminbb将仅在t.user_id为null时查找“a”中的值

ON子句中的条件只需要是可测试的表达式,它们实际上不必是“关于”您加入的表。在针对adminbb的连接的情况下,新的连接条件实际上是左边的表而不是右边的表,但这仍然是非常合法的,并且仍然会阻止在不需要时尝试连接。 / p>