Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysql中检测逗号分隔字段中的重复值_Php_Mysql - Fatal编程技术网

Php 在mysql中检测逗号分隔字段中的重复值

Php 在mysql中检测逗号分隔字段中的重复值,php,mysql,Php,Mysql,是否可以以某种方式返回mysql表中的所有行,其中一个字段具有逗号分隔字符串中的重复值 如果我们有田地 ID VALUE '1', '123,123,678' '2', '23,24,25' 在这个实例中,我只想返回第1行?在SQL中没有既实用又高效的方法来实现这一点。 正如John Conde所指出的,您应该规范化数据库,使其看起来像这样: ID VALUE 1 123 1 123 1 678 2 23 2 24 2 25 然后,通过禁止重复行,可以轻松防止

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

如果我们有田地

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

在这个实例中,我只想返回第1行?

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

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

按照目前的情况,我将把所有行放入一个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';
     }
}
你可以这样做,但会更好。
(哦,不要使用这些mysql函数;您应该使用mysqli或PDO。这只是为了向您展示它是如何工作的)。

假设您只有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


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

这就是数据库规范化使您的生活更加轻松的地方。如果没有mysql中的自定义函数,这是不可能的。此模式不太适合您的用例,并且违反了许多规则。序列化值几乎不可能在MySQL内部使用,有必要在应用程序代码中使用这些值。将其拆分为一对多关联是否可行?始终有3个值用逗号分隔?这是Magento的产品属性数据库结构,因此在本例中不可能对结构进行规范化。规范化DB是理想的是,但这是Magento EAV数据库,因此不可能。无论如何谢谢你!不错,但只在非常特定的场景中有用。仅当所有条目都有2或3个逗号分隔的值时,此选项才有效。值列中具有0或1值的条目也将被返回,因为如果指定的索引高于分隔符出现的次数,子字符串_INDEX将返回完整的列,因此在这些情况下v2=v3将为真:@wilbobagkins亲爱的!首先感谢downvote,其次我清楚地说这是用逗号分隔的3个值。它不是你说的1值。因为我问他时,他没有回答这个领域有多少价值观。其他人很容易将你的回答理解为“不超过3个价值观”,所以我觉得这是一个冒险的回答,并对此进行了评论和否决。无论如何,你所回答的问题比所问的问题要窄;不需要防守。