2014-06-11 28 views
0

查询时这是非法的情况吗?查询返回语法错误时的MySQL情况

它返回一个错误,告诉我检查在votes >= (SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold FROM votes) level T附近使用的正确语法。我在MySQL 5.0.83上运行我的数据库。

SELECT CASE WHEN (
SELECT vote_candidate, MAX(votes_above_the_threshold) votes 
FROM (
SELECT vote_candidate vote_candidate, COUNT(*) votes_above_the_threshold 
FROM vote_orders 
WHERE vote_order = 1 
GROUP BY vote_candidate 
HAVING votes_above_the_threshold >= (
SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold 
FROM votes 
) 
) t 
WHERE votes_above_the_threshold = (
SELECT MAX(votes_above_the_threshold) 
FROM vote_orders 
) 
) votes >= (
SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold 
FROM votes 
) level 
THEN (level - original_votes) 
ELSE 0 
END redistribution 

回答

1

你有几个问题在这里:

  • 您选择两列标量子查询 - >只选择一个你感兴趣的
  • 您提供一个别名“票”一个标量子查询 - >删除该别名
  • 同样,你有一个标量子查询一个“级别”的别名以后 - >删除此以及

外卖是,标量子查询SH ould 只能选择一个值没有别名

因此,我相信以下是你在找什么。请注意评论的差异:

SELECT CASE 
    WHEN (
     SELECT MAX(votes_above_the_threshold) votes 
--   ^^^ *NOTE* removed "vote_candidate, " 
     FROM (
      SELECT vote_candidate vote_candidate, COUNT(*) votes_above_the_threshold 
      FROM vote_orders 
      WHERE vote_order = 1 
      GROUP BY vote_candidate 
      HAVING votes_above_the_threshold >= (
       SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold 
       FROM votes 
      ) 
     ) t 
     WHERE votes_above_the_threshold = (
      SELECT MAX(votes_above_the_threshold) 
      FROM vote_orders 
     ) 
    ) >= (
-- ^^^ *NOTE* removed "votes" alias 
     SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold 
     FROM votes 
    ) 
-- ^^^ *NOTE* removed "level" alias 
THEN (level - original_votes) 
ELSE 0 
END redistribution 
+0

显然,这给了一个新的错误:“每一个派生表必须有它自己的别名:......”我试图让最后的选择(SELECT FLOOR ...)的名u,然后我回到了初始错误... –

+0

其实 - 这真的是对的。我错过了一些括号,但现在它返回我想要的值。非常感谢你。 :) –

0

你必须改变这一部分:

WHERE votes_above_the_threshold = (
SELECT MAX(votes_above_the_threshold) 
FROM vote_orders 
) 
) votes >= (

WHERE votes_above_the_threshold = (
SELECT MAX(votes_above_the_threshold) 
FROM vote_orders 
) 
and votes >= (

,这部分是错误的:

) level 
THEN (level - original_votes) 
ELSE 0 
END redistribution 

看起来像一个case when缺失,但我我不确定那是什么在指