【问题标题】:Unrecognized statement type. (near "IF" at position 0) - usage IF LIKE and LIKE无法识别的语句类型。 (靠近位置 0 的“IF”) - 使用 IF LIKE 和 LIKE
【发布时间】:2017-05-07 19:25:46
【问题描述】:

大家。我在 IF 构造中遇到 LIKE 问题。我有以下查询 SQL:

SELECT DISTINCT a.ID_SPORTSMAN, a.NAME, a.SURNAME, a.SEX, a.CLUB, b.RESULTS 
FROM `sportsman` AS `a` 
JOIN `results` AS `b` 
ON a.ID_SPORTSMAN = b.ID_SPORTSMAN AND b.ID_DISCIPLINE = '1' ORDER BY b.RESULTS;
IF (b.RESULTS LIKE '`%')
THEN
   ASC LIMIT 10
ELSE   
   DESC LIMIT 10
END IF

我使用 MariaDB。在 phpmyadmin 中返回这个错误:

错误

静态分析:

在分析过程中发现了 1 个错误。

Unrecognized statement type. (near "IF" at position 0)

SQL 查询:

IF (b.REZULTAT LIKE '`%') THEN ASC LIMIT 10 ELSE DESC LIMIT 10 END IF

MySQL 说:文档 1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解要使用的正确语法 在第 3 行的“ASC LIMIT 10 ELSE DESC LIMIT 10 END IF”附近

怎么了?

【问题讨论】:

  • 你的逻辑甚至没有意义。你想做什么?
  • 忽略语法错误,你想用b.RESULTS LIKE '%'实现什么??
  • 我需要对搜索结果进行排序。如果在“`”字符中找到,它将使用 ASC,如果不是 DESC
  • 在列结果中,我在许多学科(跳跃、冲刺等)中都有成绩运动员。
  • @NinjaMaker - 请添加一些示例数据和预期结果..

标签: mysql sql mariadb


【解决方案1】:

您可以尝试在order by 中使用case

select distinct s.ID_SPORTSMAN,
    s.name,
    s.SURNAME,
    s.SEX,
    s.CLUB,
    r.RESULTS
from sportsman as s
join results as r on s.ID_SPORTSMAN = r.ID_SPORTSMAN
where r.ID_DISCIPLINE = '1'
order by case 
        when r.RESULTS like '`%'
            then r.RESULTS
        end asc,
    r.RESULTS desc limit 10;

【讨论】:

  • 哇!这很聪明。并且令人困惑。当LIKE fails, the CASE` 将给出NULL,从而让_second 部分(desc)接管。 之后,剩下的就是asc
  • 这个解决方案只给你 10 行;这就是你想要的吗?
【解决方案2】:

你不能像这样使用if。从这个查询开始:

SELECT s.ID_SPORTSMAN, s.NAME, s.SURNAME, s.SEX, s.CLUB, r.RESULTS 
FROM sportsman s JOIN
     results r
     ON s.ID_SPORTSMAN = r.ID_SPORTSMAN AND r.ID_DISCIPLINE = 1
ORDER BY r.RESULTS ASC
LIMIT 10;

然后从那里开始工作。

注意事项:

  • 我删除了SELECT DISTINCT,因为我怀疑这是必要的。如果是,请使用DISTINCT
  • 我用有意义的表缩写替换了表别名。这使得查询更容易理解。
  • 我简化了 ORDER BY 子句,所以它应该可以工作。
  • 我删除了“1”周围的单引号,因为它可能是一个整数。

你可以修改它以获得你真正想要的。

编辑:

嗯,我想你可能想要这个:

(SELECT s.ID_SPORTSMAN, s.NAME, s.SURNAME, s.SEX, s.CLUB, r.RESULTS 
 FROM sportsman s JOIN
      results r
      ON s.ID_SPORTSMAN = r.ID_SPORTSMAN AND r.ID_DISCIPLINE = 1
 WHERE s.RESULTS LIKE '`%'
 ORDER BY r.RESULTS ASC
 LIMIT 10
) UNION ALL
(SELECT s.ID_SPORTSMAN, s.NAME, s.SURNAME, s.SEX, s.CLUB, r.RESULTS 
 FROM sportsman s JOIN
      results r
      ON s.ID_SPORTSMAN = r.ID_SPORTSMAN AND r.ID_DISCIPLINE = 1
 WHERE s.RESULTS NOT LIKE '`%'
 ORDER BY r.RESULTS DESC
 LIMIT 10
);

【讨论】:

  • 我知道,但这不是问题所在。我必须使用 IF,因为记录有符号 (tylda) I want 排序 [z-a],如果没有这个字符我想要排序 [a-z]
  • UNION 为您提供每组最多 10 个;这就是你想要的吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-16
  • 2018-10-06
  • 1970-01-01
  • 2015-12-15
  • 2011-06-22
  • 2020-08-30
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多