2013-10-10 52 views
-2

我知道这个查询可能有缺陷,但你能告诉我如何使它更好。它给我错误。我是初学者,所以请不要粗鲁。试图做一个查询

查询是:

SET @start = 0; 

IF @start <= 45 
        (SELECT 
        groups.id AS groupid, 
        count(papers.classes) AS cl, 
        start + cl AS st 
       FROM groups, 
        gpaper, 
        papers 
       WHERE cid = '1' 
        AND sid = '4' 
        AND groups.id = '14' 
        AND gpaper.gid = groups.id 
        AND gpaper.pid = papers.paperid 
       ORDER BY groupname) AS t 

我想从查询结果中,直到ST等于CL。

错误我得到的是:

#1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本正确的语法使用近在行 'IF @启动< = 45 (SELECT groups.id为g' 手动1

+1

有什么错误?知道我们必须解决什么或解释什么会更容易。 –

+0

'我想要查询的结果,直到st等于cl。我知道cl没有定义。你如何将未定义的东西等同于另一个东西?我认为如果你能展示一些样本数据和预期结果会更好。 – Kaf

+0

这将是一个PHP变量。抱歉让我纠正它。 –

回答

0

这是

IF (whatever = whatever) THEN /*<- then!*/ 
SELECT whatever FROM whatever; /*no parantheses and no alias*/ 
END IF; 

另外请注意,你不能使用这个,如果那么在一个简单的查询的事情,你必须使用它在一个存储过程或一个函数

0

你似乎只想做同样的查询46次,与唯一的区别是你是否加0,1,...,4 5到一个字段。

果真如此的话,也许可以与一个SELECT来完成: -

SELECT Sub1.groupid, Sub1.cl, Sub1.cl + Sub0.iCnt AS st 
FROM 
(
    SELECT units.i + tens.i * 10 AS iCnt 
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
    HAVING iCnt BETWEEN 0 AND 45 
) Sub0 
CROSS JOIN 
(
    SELECT groups.id AS groupid, count(papers.classes) AS cl 
    FROM groups 
    INNER JOIN gpaper ON gpaper.gid = groups.id 
    INNER JOIN papers ON gpaper.pid = papers.paperid 
    WHERE cid = '1' 
    AND sid = '4' 
    AND groups.id = '14' 
) Sub1 
ORDER BY Sub0.iCnt, groupname