2015-05-22 31 views
2

我有一张阿拉伯文字表。我想删除重复的行。在阿拉伯语鉴于符号:如何删除考虑阿拉伯语音标的重复行

我的表: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的阿拉伯文的符号?

+0

@diggersworld我会加我的试试 – Shafizadeh

+0

请不要告诉我:不要再使用'mysql_ *'了......!我知道了! – Shafizadeh

+0

[删除MySQL中的重复行](http:// stackoverflow。com/questions/3311903/remove-duplicate-rows-in-mysql) – umka

回答

1

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

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

2 - 另一种方式来提取IDS是使用类似于下面的查询:

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

您可以再通过结果循环和删除行(使用IDS),其中计数大于1.

这两个(和其他方法)的基本概念是,你只需要匹配字符串。在字母上的语音改变了实际的字符串,所以“سلام”不等于“سلام”。

在一个侧面说明,有一个很大的阿拉伯语PHP库,您可以使用各种阿拉伯语相关的字符串操作:PHP and Arabic Language

这种方式只会删除一个重复。

还有其他几种方法可以做到这一点,这一切都取决于您拥有的数据集的大小,并且删除这些重复项是一次性事务还是频繁事件,因为您必须牢记性能。

+0

我很高兴你能理解我的问题,我会检查它,并给你结果.. – Shafizadeh

+0

很高兴我能帮上忙。使用阿拉伯语有时候会很痛苦,但如果你知道自己在做什么,这很简单,如果你知道这种语言,这也会有所帮助。 – Adon

+0

您只能以这种方式删除每个标题的一个重复项。或者,您可能希望在“count”查询的结果中包含'title'(和'MIN(id)'而不是'id'作为可预测性),然后删除标题匹配和id不匹配的地方;这将保证第一个始终保留,并将处理具有多个重复的案例。 – Uueerdo

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错误。

如果它是一个大表,沿阿东的回答线的东西可能会更快。

+1

这不起作用。 MySql不会让你运行这个查询。它会产生SQL错误1093,这是合理的,因为您正在从您正在选择的数据集中删除。 – Adon

+0

这是行不通的。此错误:_您无法在FROM子句中指定目标表'test'进行更新_ – Shafizadeh

+1

已编辑,它不再是单个查询,但仍可完全在SQL中完成。 @Sajad,如果你不熟悉TEMPORARY表,它们只在数据库连接打开的时候才存在,并且只能用于该连接。 – Uueerdo