【问题标题】:MySQL Replace Value From Each RecordMySQL 替换每条记录的值
【发布时间】:2012-03-26 06:56:22
【问题描述】:

我的数据库中有一个如下所示的表:

==========
|编号 |代码 |
=========
| 1 |一个 |
=========
| 2 | e |
=========
| 3 | r |
=========

等等。我希望能够进行查询,告诉我字母表中的哪些字母在表中。

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

SELECT REPLACE('abcdefghijklmnopqrstuvwxyz', (SELECT code FROM table), '');

并希望它会输出“defghijklmnopqrstuvwxyz”,我可以将其分解为一组未使用的字符。不幸的是,MySQL 的 REPLACE 不允许使用值表。

关于如何建立这个列表有什么建议吗?

【问题讨论】:

  • MySql 有点生疏了,但这是个好问题。我想我会首先考虑将一些东西与WHERE NOT IN (SELECT code FROM table) 结合起来
  • @DerekTomes 这就是我最初的想法。不幸的是,“FROM”表需要一个单独的整个字母表的静态表。我尝试创建一个直接表('a'、'b'、'c'...),但 FROM 字段中不允许使用该语法
  • @Col.Shrapnel 呃,我为什么需要什么?
  • 如何创建另一个以 a-z 作为行的表并执行相交/减号?
  • 那个愚蠢的东西。您试图以这种不同寻常的方式解决现实生活中的什么问题?

标签: php mysql replace unique


【解决方案1】:

推荐的方法是为字母表中的每个字母创建一个表格,这样可以轻松删除字母最后是 LEFT JOIN 和 GROUP_CONCAT。

缺少该表,您将不得不求助于 hack,在临时变量和行数多于字母数的表之间使用 JOIN 构建临时“字母表”。对于此示例,我使用 INFORMATION_SCHEMA.COLLATIONS。

SELECT GROUP_CONCAT(CHAR(ch) SEPARATOR '') 'missing letters' FROM 
  (SELECT @tmp:=@tmp+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 中不存在的所有字母。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 可能的答案,可能是我将要做的。理想的情况是从 SQL 查询中完成,但这可能就足够了。
    • 您可以在 sql 中执行此操作:创建一个存储过程来填充创建一个包含所有可能字母的临时表,然后您只需构建一个简单的查询即可获得结果。
    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多