【问题标题】:mysql statement issuemysql语句问题
【发布时间】:2011-10-10 20:11:13
【问题描述】:

我有一个 MySQL 语句在我的查询程序 (Navicat) 中运行良好,但是当我尝试将它放在水晶命令中时,它会引发错误

声明是

set @rownum=0
Select 
  @rownum := @rownum +1 as ranknum
  , cust_name
  ,  count(distinct callref) as rank 
from opencall 
where logdate like '%/08/2011%' 
  and companyname = "McDonald's Nederland" 
group by cust_name 
order by rank desc

错误是

无法从数据库中检索数据。详细信息 42000 [MYSQL] [ODBC 3.51 驱动程序] [mysqld-4.0.16] 您的 SQL 语法有错误。检查与您的 MYSQL 服务器版本相对应的手册,以了解在 'Select @rownum :=@rownum +1 as ranknum,cust_name, count(dist [Database Vendor Code:1064 ]

附近使用的正确语法

【问题讨论】:

  • 反对票不是我的,但请永远不要说“它正在抛出错误”而不确切地说哪个错误。永远记得引用确切的错误信息。
  • 已添加消息道歉并没有意识到我的错误会激怒到足以让我投反对票的人
  • 投反对票,请说明该声明的预期结果。
  • @Annette:这不是“激怒”人们的问题。如果您需要帮助,您需要发布错误消息,这是常识,否则人们怎么知道问题是什么?
  • 我需要 Crystal 报表子报表中的排名号

标签: mysql


【解决方案1】:

您需要使用 ; 分隔语句

set @rownum=0;
SELECT
  @rownum := @rownum +1 as ranknum
  , cust_name
  , COUNT(distinct callref) as rank 
FROM opencall 
WHERE logdate LIKE '%/08/2011%'    <<-- ?? dates are stored YYYY/MM/DD in a DB.
  AND companyname = "McDonald's Nederland" 
GROUP BY cust_name 
ORDER BY ranknum DESC   <<-- ranknum, **not** rank

或者,您可以在连接中进行初始化:

SELECT
  @rownum := @rownum +1 as ranknum
  , cust_name
  , COUNT(distinct callref) as rank 
FROM opencall 
INNER JOIN (SELECT @rownum := 0) AS initializaton
WHERE logdate LIKE '%/08/2011%' 
  AND companyname = "McDonald's Nederland" 
GROUP BY cust_name 
ORDER BY ranknum DESC

你确定你不是故意的:

SELECT
  @rownum := @rownum +1 as ranknum
  , cust_name
  , COUNT(distinct callref) as rank 
FROM opencall  
CROSS JOIN (SELECT @rownum := 0) AS initializaton
WHERE logdate BETWEEN '2011-08-01' AND '2011-08-31' 
  AND companyname LIKE "McDonald's Nederland"  <<-- like is case-insensitive
GROUP BY cust_name                             <<-- `=` can be case sensitive
ORDER BY ranknum DESC

【讨论】:

  • 首先感谢您的帮助。我已经尝试了这两种方法,并且得到的结果与提到的错误相同,只是它在附近声明;例如 a or '@rownum:= 0) AS initializaton WHERE logdate like '%/08/' in your second answer
  • 不能使用 logdate 作为 logdate 来执行此操作,尽管保存日期时间实际上是一个 varchar 字段
  • @Annette,第一个查询不能在一个语句中发出,您需要将它们作为两个单独的语句执行。例如:query.sql.text:= 'set @rownum=0;';查询.execSQL; query.sql.text:= '选择 ...';查询.打开;
  • 将日期放在 varchar 中是个坏主意,这就是 datedatetime 的用途:-)
  • 是的,我完全同意,但这不是我的数据库,而是一个客户,不幸的是我对此无能为力。我已经对此表达了我的想法,但是我坚持下去并且必须使用我所拥有的:(
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 2016-09-03
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多