是否有可能以某种方式返回mysql表中的所有行,其中一个字段在逗号分隔的字符串中具有重复值?
EG如果我们有字段
ID VALUE
'1', '123,123,678'
'2', '23,24,25'
我只想在这个例子中返回第1行?
答案 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
OBS:将额外的v1,v2,v3分开,这样你就可以在工作中使用它们