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的演示吗?