【问题标题】:string slicing in php or mysql substring_indexphp 或 mysql 中的字符串切片 substring_index
【发布时间】:2019-02-17 23:15:52
【问题描述】:

必须对以下查询的输出进行切片。

GROUP_CONCAT(DISTINCT subject.id, '-', subject.en_title ORDER BY subject.id) AS sub,

输出是

3-Math
4-Science

我正在使用 PHP substr

$sub=substr(strstr($row['sub'], '-'), 1);

所以结果会是

Math
Science

但如果可以在mysql中切片会更好,因为我认为它减少了php代码和从数据库获取的数据更少。 所以我尝试了 SUBSTRING_INDEX

SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT subject.id, '-', subject.en_title ORDER BY subject.id), '-', -1) AS sub,

但我只得到一行

Science

这里,SUBSTRING_INDEX 影响选择行吗?如果不是,我怎样才能获取预期的输出

【问题讨论】:

  • 请显示整个SELECT函数。
  • 所以你想连接字段 subject.en_title 并在同一个查询中再次剥离它?为什么不直接使用这个字段呢?

标签: php mysql group-concat


【解决方案1】:

您应该尝试使用 REPLACE

SELECT
REPLACE(GROUP_CONCAT(DISTINCT subject.id, '-', subject.en_title ORDER BY subject.id), '-', 1) AS sub

我还将 DISTINCT 放在 GROUP_CONCAT 之外,并正确使用 GROUP BY

【讨论】:

  • 我得到了结果31Math41Science。它将-替换为1,我需要在-之前删除字符串,所以结果将是MathScience
  • 你需要什么?
  • 我需要删除特殊字符-之前的字符串,我得到的结果是3-Math,但我只需要Math从特殊字符-中删除部分
  • 那你为什么要在第一名选择字段 subject.id 呢?如果您需要 DISTINCT id,那么您应该重新编辑您的查询,请添加到问题中,我将能够改进我的答案
  • 如果我不首先包含DISTINCT subject.idsubject.title 将被重复,如果有相同的subject.title,为了防止重复,我分配DISTINCT.id
【解决方案2】:

您不需要CONCAT subject.id。您可以直接在subject.en_title 上使用DISTINCT 子句。请改用以下表达式:

GROUP_CONCAT(DISTINCT subject.en_title ORDER BY subject.id) AS sub

【讨论】:

  • SUBSTR 未关闭后的括号,在哪里放置它的右括号,
  • @AnandHmt 检查编辑后的答案。请确认它是否有效?
  • 谢谢 - 但我得到了部分结果,我得到了Math4-Science,我该如何解决这个问题?
猜你喜欢
  • 2012-07-16
  • 2020-11-27
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多