【问题标题】:Splitting strings and joining the duplicates拆分字符串并加入重复项
【发布时间】:2010-12-01 08:37:05
【问题描述】:

我正在尝试创建一个带有扭曲的下拉选择框,

基本上,这是一个 Ajax 表单,当从列表中选择一个项目时,它会将其添加到文本字段中。不过我还想在这里添加一些额外的选择。

我得到的字符串由 COMPANY_SITE_DEPARTMENT 和例如SDGCC_NEWTOWN_INBOUND

使用 PHP 我希望从 logintags 表中的数据库中获取每个项目,其中可能包含多个 COMPANY_ 所以任何声明 SDGCC 我希望下拉框有添加 all SDGCC 站点的特殊选择是否有意义?我已经尝试过了,但如果有不止一行包含 SDGCC 标记,我会得到重复。

重复:

SDGCC_NEWTOWN_INBOUND
SDGCC_NEWTOWN_QH
SDGCC_BOLTON_QH
ARISE_HOME_ORDERS
ARISE_HOME_ENQUIRIES

等等……

所以基本上它有一个选择所有 SDGCC 站点的选项,但因为该数据库可能随时更改,我们只需要字符串的第一部分(即 SDGCC、ARISE)部分显示(一次)在选择框。

我目前正在尝试从下面建议的查询

SELECT DISTINCT SUBSTRING(tag, 0, LOCATE('_', tag)) 来自dept_logintags 限制 0 , 30

但是这不会返回任何行

【问题讨论】:

  • 你可以改写你的问题,我真的不明白你想要什么。什么是“SDGCC”或“登录标签”?你能使用更一般的有效术语吗?或许可以举个例子……
  • 如果您阅读,SDGCC 是我想要拆分的字符串的一部分。
  • 你想在所有三个值上都有一个 CROSS JOIN 吗?
  • 你能举一个从下拉菜单中选择的项目的例子吗?
  • 你能举一个重复的例子吗?

标签: php string duplicate-removal


【解决方案1】:

不要重新发明轮子

基本上你想要的是你的登录标签的COMPANY_ 部分的不同。

为什么不从数据库中读取DISTINCT 的数据?通过在查询中使用去掉第一部分的表达式列,您可以轻松地在字符串值的第一部分创建 DISTINCT。所以你根本不需要在中间层进行任何字符串操作?

Microsoft SQL 示例

// first part
SELECT DISTINCT SUBSTRING(tag, 0, CHARINDEX(tag, '_')) FROM dept_logintags
// second part
SELECT DISTINCT SUBSTRING(SUBSTRING(tag, CHARINDEX(tag, '_') + 1, LEN(tag)), 0, CHARINDEX(tag, '_')) from dept_logintagss
// last part
SELECT DISTINCT SUBSTRING(SUBSTRING(tag, CHARINDEX(tag, '_') + 1, LEN(tag)), CHARINDEX(tag, '_') + 1, LEN(tag)) from dept_logintags

因为最终你想在 PHP 中做同样的事情。

MySQL 示例

在 MySQL 中,您甚至可以使用 SUBSTRING_INDEX 函数进一步简化选择

// first part
SELECT DISTINCT SUBSTRING_INDEX(tag, '_', 1) FROM dept_logintags
// second part
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(tag, '_', 2), '_', -1) from dept_logintags
// last part
SELECT DISTINCT SUBSTRING_INDEX(tag, '_', -1) FROM dept_logintags

【讨论】:

  • 添加的代码就够了吗?如果你需要返回更多的列,比做一个 GROUP BY 表达式列
  • 好的,那么数据库怎么知道你从哪个表得到的,因为我在字段列表中没有字段登录标签
  • 我省略了表名,因为表达式更重要。所以我现在加了。关键是你明白了。
  • 在 MySQL 中 LOCATE 是正确的函数,但要小心参数,因为前两个必须切换。
  • 只使用嵌套函数,例如:SUBSTRING_INDEX(SUBSTRING_INDEX(tag, '', 2), '', -1)
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 2020-01-19
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多