2016-04-25 52 views
1

我试图回答这样一个问题:在使用MySQL的SQL查询角色出现在字符串的第一个位置和第二个位置的频率是多少?

How often does a character occur in the first position versus the second position of a string?

但是我得到一个语法错误。

代码:

SELECT 
    onechar, 
    ASCII(onechar) as asciival, 
    COUNT(*) as cnt, 
    SUM(CASE WHEN pos = 1 THEN 1 ELSE 0 END) as pos_1, 
    SUM(CASE WHEN pos = 2 THEN 1 ELSE 0 END) as pos_2 
FROM (
    (SELECT 
     SUBSTRING(`city`, 1, 1) as onechar, 
     1 as pos 
    FROM `orders` 
    WHERE LEN(`city` >= 1) 

    UNION ALL 

    (SELECT 
     SUBSTRING(`city`, 2, 1) as onechar, 
     2 as pos 
    FROM `orders` 
    WHERE LEN(`city` >= 2) 
    ) 
GROUP BY onechar 
ORDER BY onechar 

错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY onechar ORDER BY onechar LIMIT 0, 30' at line 1

试了几种方法都没有成功。

任何人都可以告诉我这个问题?

+0

在查询中有不匹配的圆括号。 –

+0

嗨费利克斯,你能指导我在哪里? –

回答

0

圆括号看起来不正确,查询缺少派生表的别名。另外,因为mysql会将布尔值计算为1或0,所以可以简化您的sum语句。试试这个:

SELECT onechar, ASCII(onechar) as asciival, COUNT(*) as cnt, 
SUM(pos = 1) as pos_1, 
SUM(pos = 2) as pos_2 
FROM (
    SELECT SUBSTRING(`city`, 1, 1) as onechar, 1 as pos 
    FROM `orders` WHERE LENGTH(`city`) >= 1 
    UNION ALL 
    SELECT SUBSTRING(`city`, 2, 1) as onechar, 2 as pos 
    FROM `orders` WHERE LENGTH(`city`) >= 2 
) t 
GROUP BY onechar 
ORDER BY onechar 
+0

它给了我一个错误#1305 - 函数sql_test.LEN不存在 –

+0

@JonathanLivingstonSeagull正确的名称是'长度'而不是'len'请参阅更新。此外,条件应该超出函数 – FuzzyTree

+0

的范围,即使更改LENGHT的LEN,我仍然会得到“每个派生表都必须具有其自己的别名”。不确定它是什么。有没有办法解决这个问题? –

0

您错过了一些右括号。

FROM (
    (SELECT 
     SUBSTRING(`city`, 1, 1) as onechar, 
     1 as pos 
    FROM `orders` 
    WHERE LEN(`city` >= 1) 
    ) 
    UNION ALL 

    (SELECT 
     SUBSTRING(`city`, 2, 1) as onechar, 
     2 as pos 
    FROM `orders` 
    WHERE LEN(`city` >= 2) 
    ) 
) 
+0

不幸的是没有工作我得到的错误:每个派生表都必须有自己的别名 –

+0

每个派生表都必须有一个别名。 (注意作为自定义别名)。忘了提及,将LEN替换为LENGTH – AJ93

相关问题