0

谁能告诉我这里的语法错误在哪里:

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 服务器版本相对应的手册,以在第 3 行的 '(CASE WHEN t. user_idIS NOT NULL THEN JOIN adminbb uON t.`admin_id'附近使用正确的语法

谢谢艾伦。

4

2 回答 2

1

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

选择 [全部 | 区别 | 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`
于 2013-09-18T11:08:19.903 回答
1

这在 MySQL 中并不难实现,一旦您概念化了您要求服务器执行的操作。

我已经反转了IS NOT NULL针对 t.user_id 的测试,因为您原来的 case 语句似乎是倒退的,当 t.user_id 不为空时加入管理员,当 t.user_id 为空时加入用户,这似乎是不可能的。除此之外,这里有一个查询,它通过在可能的情况下加入用户并在其他情况下加入管理员来获取 first_name 和 second_name。连接是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 不为空),并且 LEFT JOIN adminbb 将仅在 t.user_id 为空时从“a”中查找值。

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

于 2013-09-18T14:27:46.257 回答