Php 在mysql中检测逗号分隔字段中的重复值
是否可以以某种方式返回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 然后,通过禁止重复行,可以轻松防止
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个价值观”,所以我觉得这是一个冒险的回答,并对此进行了评论和否决。无论如何,你所回答的问题比所问的问题要窄;不需要防守。