Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 考虑到阿拉伯语语音,如何删除重复行_Php_Mysql - Fatal编程技术网

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

Php 考虑到阿拉伯语语音,如何删除重复行,php,mysql,Php,Mysql,我有一张阿拉伯文本表。我想删除重复的行。鉴于阿拉伯语中的符号:َُِ 我的表格:词汇表 +----+----------+--------------------------------+ | id | word | mean | -------------------------------------------------- | 1 | سِلام | xxx |

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

我的表格:
词汇表

+----+----------+--------------------------------+
| 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'");
}

摘要:我如何才能识别阿拉伯符号?

实现这一点有多种方法

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

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

按标题从表组中选择count(*),id

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

这两种方法(以及其他方法)的基本概念都是只需匹配字符串即可。字母上的语音会改变实际字符串,因此“سَلام”不等于“سلا”

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

这样只会删除一个副本


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

我没有测试过它,但这应该可以:

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的回答可能会更快。

@diggersworld我会添加我的tryPlease不要告诉我:不要再使用
mysql.*
。。。!我知道!@umka可能重复,但不是重复!!!我想对阿拉伯符号敏感!如果你使用正确的字符,它应该是敏感的。我很高兴你能理解我的问题,我会检查它并给你结果。很高兴我能帮上忙。使用阿拉伯语有时会很痛苦,但如果你知道自己在做什么,这是非常直接的,如果你也懂阿拉伯语,这会很有帮助。这样,你只能删除每个标题的一个副本。或者,您可能希望在“计数”查询的结果中包含
标题
(以及
MIN(id)
,而不是
id
,以实现可预测性),然后删除标题匹配而id不匹配的位置;这将保证第一个始终被保留,并且将处理具有多个副本的情况。不幸的是,它不起作用,您能给我一个SQLFIDLE的演示吗?tnxpal@uureedo他的评论是正确的。萨贾德,你能说明什么不起作用吗?这不起作用。MySql不允许您运行此查询。它将产生SQL错误1093,考虑到您正在从选择的数据集中删除,这是合理的。它将不起作用。此错误:无法在FROM clauseEdited中为更新指定目标表“test”,它不再是单个查询,但仍然可以完全在SQL中完成@Sajad,如果您不熟悉临时表,它们只在数据库连接打开时存在,并且只在该连接中存在。您能给我一个关于SQLFIDLE的演示吗?