【问题标题】:Mysql Case Statement syntaxMysql 案例语句语法
【发布时间】:2013-09-23 02:38:27
【问题描述】:

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

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_id IS NOT NULL THEN JOIN adminbb u ON t.`admin_id' 附近使用正确的语法

谢谢艾伦。

【问题讨论】:

标签: mysql case


【解决方案1】:

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

选择 [全部 |区别 |区别 ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_缓存 | 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`

【讨论】:

  • 谢谢,您的解决方案不太适合,因为您要进行两次连接,我想根据 t.user_id 的值为 NULL 或 NOT NULL 进行一次连接
  • @AlanA 在 mysql 中不可能,抱歉。
  • 我不明白,什么是不可能的,我想要实现什么或在你的例子中加入两个?
  • 无法根据条件选择加入哪个表。
  • 我认为唯一的解决方案是使用诸如 PHP 之类的语言来实现我的目标,我会全选,解析每个结果并根据 user_id NULL 或 NOT NULL 为每一行执行单独的连接
【解决方案2】:

这在 MySQL 中并不难实现,一旦你概念化了你要求服务器做什么。

我已经反转了针对 t.user_id 的 IS NOT NULL 测试,因为您原来的 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() 函数返回其参数中最左边的非空值。

如果存在并且 t.user_id 不为空,LEFT JOIN 用户将从“u”中获取值,并且仅当 t.user_id 为空时,LEFT JOIN adminbb 才会从“a”中查找值.

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

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多