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

时间:2014-03-19 14:55:05

标签: php mysql

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

EG如果我们有字段

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

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

2 个答案:

答案 0 :(得分:1)

在SQL中无法实现这一点,既实用又有效。 如John Conde所示,您应该规范化您的数据库,使其如下所示:

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

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

目前的情况是,我会将所有行都放入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。这只是为了告诉你它是如何工作的。)

答案 1 :(得分:0)

假设您只有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分开,这样你就可以在工作中使用它们