【问题标题】:Detect duplicate values in a comma separated field in mysql检测mysql中逗号分隔字段中的重复值
【发布时间】:2014-04-25 22:14:52
【问题描述】:

是否有可能以某种方式返回 mysql 表中的所有行,其中一个字段在逗号分隔的字符串中具有重复值?

EG 如果我们有字段

ID    VALUE
'1', '123,123,678'
'2', '23,24,25'

在这种情况下我只想返回第 1 行?

【问题讨论】:

  • 这是数据库规范化让您的生活更轻松的地方
  • 如果没有 mysql 中的自定义函数,这是不可能的。
  • 此模式不太适合您的用例,并且违反了proper database normalization 的许多规则。在 MySQL 内部几乎不可能使用序列化值,有必要在应用程序代码中使用这些值。将其拆分为一对多关联是否可行?
  • 你总是有 3 个用逗号分隔的值?
  • 这是 Magento 的产品属性数据库结构,因此在这种情况下不可能对结构进行规范化。

标签: php mysql


【解决方案1】:

假设您只有 3 个逗号分隔的值。然后你可以通过mysql使用它并摆脱php:

  select a.id,a.v1 , a.v2,a.v3,a.value from (
       SELECT id,value,SUBSTRING_INDEX(value, ',', 1)as v1,
              SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', 2), ',', -1) as v2,
              SUBSTRING_INDEX(value, ',', -1) as v3
       FROM table1 )a
 where v1 = v2 or v1 = v3 or v2 = v3

DEMO HERE

OTHER DEMO with extra values

OBS:将额外的 v1、v2、v3 分开,所以您可以在工作中使用它们

【讨论】:

  • 很好,但只在非常特定的场景中有用。这仅在 all 条目具有 2 或 3 个逗号分隔值时才有效。在 VALUE 列中具有 0 或 1 值的条目也将被返回,因为如果指定的索引高于分隔符出现的次数,则 SUBSTRING_INDEX 会返回完整列,因此在这些情况下 v2 = v3 将是真的:sqlfiddle.com/#!2/c4263c/1/0
  • @WilboBaggins 亲爱的!首先感谢 downvote ,其次我清楚地说这用于 3 值逗号分隔。它不是你所说的 1 值。因为当我问here 时,他没有回答这个字段中有多少个值。
  • 其他人可以很容易地将您的答案解释为“不超过 3 个值”,所以我觉得这是一个有风险的答案,并发表了评论和投票。无论如何,您回答的问题比提出的问题要窄;无需防守。
【解决方案2】:

在 SQL 中无法做到这一点既实用又高效。 正如 John Conde 所指出的,您应该规范化您的数据库,使其看起来像这样:

ID  VALUE
1   123
1   123
1   678
2   23
2   24
2   25

然后您可以通过禁止重复行轻松防止出现这种情况 (例如,通过在 ID 和 VALUE 列上定义唯一索引)。如果你不能/不想阻止它的发生,你至少可以更容易地检测到它inpureSQL

就目前而言,我会将所有行放入 PHP 数组并从那里检测重复值。这也不是很有效,但至少它比尝试在纯 SQL 中实现这一点更实用。

$result = mysql_result('select ID, VALUE from table');
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
     $values_array = explode( ',' , $row['VALUE'] );
     if(count($values_array) != count(array_unique($values_array)))
     {
          // There must be duplicate values in the array
          echo 'Row with id ' .$row['ID'] .' has duplicate values';
     }
}

你可以这样做,但normalizing your database 会好得多。 (哦,不要使用这些 mysql_... 函数;你应该使用 mysqli 或 PDO。这只是为了向你展示它是如何工作的)。

【讨论】:

  • 标准化数据库是理想的,但这是一个 Magento EAV 数据库,所以不可能。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
相关资源
最近更新 更多