2012-03-08 59 views
4

我有我的数据库中的表看起来像这样:MySQL的替换值每条记录

=========
| id |代码|
=========
| 1 | a |
=========
| 2 | e |
=========
| 3 | r |
=========

等等。我希望能够做一个查询,告诉我表中哪些字母是而不是

我本来想查询的是这样的:

SELECT REPLACE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',(SELECT代码表), '');

并希望这会输出'defghijklmnopqrstuvwxyz',我可以将它分解成一个未使用的字符数组。不幸的是,MySQL的REPLACE不允许使用一个值表。

有关如何建立此列表的任何建议?

+0

My MySql有点生疏,但这是一个很好的问题。我想我会首先考虑将'WHERE NOT IN'(SELECT code FROM table)' – 2012-03-08 19:36:33

+0

@DerekTomes'结合起来。这就是我最初的想法。不幸的是,它需要一个单独的“FROM”表的整个字母表的静态表。我尝试创建一个直接表('a','b','c'...),但在FROM字段中不允许使用该语法。 – jwegner 2012-03-08 19:39:45

+0

为什么你需要这个? – 2012-03-08 19:43:08

回答

1

的方式,我会建议这样做是创建一个表,一排字母表中的每个字母,这将可以很容易地删除与左边的字母JOIN和GROUP_CONCAT底。

由于缺少该表,您必须诉诸黑客手段,使用临时变量和行数超过字母数的表之间的JOIN构建临时“字母表”。对于这个例子,我使用INFORMATION_SCHEMA.COLLATIONS。

SELECT GROUP_CONCAT(CHAR(ch) SEPARATOR '') 'missing letters' FROM 
    (SELECT @tmp:[email protected]+1 ch 
    FROM (SELECT @tmp:=96) a, INFORMATION_SCHEMA.COLLATIONS 
    WHERE @tmp<122) z 
LEFT JOIN TableA ON ch=ORD(TableA.code) 
WHERE TableA.code IS NULL; 

嵌套的SELECT构建字母表序列,LEFT JOIN删除TableA(您的表)中存在的字母。 GROUP_JOIN连接结果字母。结果是包含TableA中不存在的所有字母的字符串。

0

构建服务器端的逻辑。创建一个查询来获取所有使用的字母(distinct),然后遍历结果集并从可能的数组/字符串中清除已使用的字符。

+0

可能的答案,可能是我必须要做的。理想的情况是只从SQL查询中完成,但这可能已经足够了。 – jwegner 2012-03-08 19:40:55

+0

你可以在sql中做到这一点:创建一个存储过程,填充创建一个临时表所有可能的字母,然后你只需要建立一个简单的查询来获得结果。 – 2012-03-08 19:43:37