考虑到阿拉伯语语音,如何删除重复行

时间:2015-05-22 16:21:51

标签: php mysql

我有一张阿拉伯文字表。我想删除重复的行。鉴于阿拉伯语中的符号:

我的表: vocabulary

+----+----------+--------------------------------+
| id |   word   |              mean              |
--------------------------------------------------
| 1 |    سِلام    |              xxx               |
--------------------------------------------------
| 2 |    سَلام    |              xxx               |
--------------------------------------------------
| 3 |    سلام    |              xxx               |
--------------------------------------------------
| 4 |    سلام    |              xxx               |
+------------------------------------------------+  

现在我想要这张桌子:

+----+----------+--------------------------------+
| id |   word   |              mean              |
--------------------------------------------------
| 1 |    سِلام    |              xxx               |
--------------------------------------------------
| 2 |    سَلام    |              xxx               |
--------------------------------------------------
| 3 |    سلام    |              xxx               |
+------------------------------------------------+

我该怎么做?!

我的尝试:

$result = mysql_query( "SELECT * FROM vocabulary where");
while($end = mysql_fetch_assoc($result)){

    $word = $end["word"];
    $mean = $end["mean"];
    $id = $end["id"];


$result2 = mysql_query( "SELECT * FROM vocabulary where word='$word' AND mean='$mean'");
$TotalResults = mysql_num_rows($result2);

if($TotalResults>1){

     mysql_query( "DELETE FROM vocabulary WHERE id='$id'");
}

摘要:如何将MySQL敏感地识别为阿拉伯语符号?

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一目标。

1-您可以从数据库中选择行,循环遍历它们并将“word”标题保存在数组中,并且在循环的每次迭代中,您可以检查类似的值是否为in_array() 。如果值存在,则可以将id保存在另一个数组中,然后使用这些id从数据库中删除。

2-提取ID的另一种方法是使用类似下面的查询:

select count(*), id from table group by title

然后,您可以遍历结果并删除计数大于1的行(使用ID)。

两种(和其他方法)的基本概念是你必须匹配字符串。字母上的语音更改实际字符串,因此“سلام”不等于“سلام”。

另一方面,有一个很棒的阿拉伯语PHP库可用于各种阿拉伯语相关的字符串操作:PHP and Arabic Language

这种方式只会删除一个副本。

还有其他几种方法可以做到这一点,这一切都取决于你拥有的数据集的大小,如果删除这些重复项是一次性事情或频繁的事情,因为你必须记住性能。< / p>

答案 1 :(得分:1)

我还没有对它进行测试,但这应该可行:

CREATE TEMPORARY TABLE tmp_keeps
    SELECT title, MIN(id) AS keepID
    FROM theTable 
    GROUP BY title
;

DELETE FROM theTable 
WHERE (title, id) NOT IN (
    SELECT title, keepID
    FROM tmp_keeps
    )
;

DROP TEMPORARY TABLE tmp_keeps;

它(在子查询中)获取每个标题的第一个id,然后删除不符合该条件的行。

编辑:修改以避免在评论中指出SQL错误。

如果它是一张大桌子,那么Adon的回答可能会更快。