MySQL - 比较 Ajax 数组中的值,如果不在表中,则删除它们
Posted
技术标签:
【中文标题】MySQL - 比较 Ajax 数组中的值,如果不在表中,则删除它们【英文标题】:MySQL - Compare Values from Ajax array and DELETE them IF NOT in TABLE 【发布时间】:2014-06-23 03:50:41 【问题描述】:使用 POST METHOD $tab_tuto_sauvegarde = $_POST['tableau_valeurs_modifiees'];
Ajax 请求会向我返回此信息:
[Mots_cles_supprimes] => Array
(
[0] => jambon
[1] => rap
[2] => tomate
)
我有这些表
TABLE 1 named 'Mots_cles'
| mots_cles |
_____________
| jambon |
| rap |
| tomate |
TABLE 2 named 'Mots_cles_et_tutoriels'
| id_tutoriel || mots_cles |
______________________________
| ID1 || rap |
| ID1 || rap |
| ID2 || tomate |
| ID2 || rap |
| ID2 || tomate |
首先我在TABLE 2
中的tableau_valeurs_modifiees.['Mots_cles_supprimes']
中的每个[index]
[index]
像这样:
if (isset ($tab_tuto_sauvegarde['Mots_cles_supprimes']))
$sql_Mots_cles_id_tutoriel = "";
foreach($tab_tuto_sauvegarde['Mots_cles_supprimes'] as $index => $valeur)
$sql_Mots_cles_id_tutoriel .= "('$id_tutoriel', '$valeur'), ";
if($sql_Mots_cles_id_tutoriel !== "")
$sql_Mots_cles_id_tutoriel = substr($sql_Mots_cles_id_tutoriel, 0, -2); // Supprime la ',' à la fin de la chaine de caractere
mysqli_query($BDD_connect, "DELETE FROM Mots_cles_et_tutoriels WHERE (id_tutoriel, mots_cles) IN (".$sql_Mots_cles_id_tutoriel.")");
效果很好!
但是,我需要将tableau_valeurs_modifiees.['Mots_cles_supprimes']
中的每个[index]
(这里:“jambon”、“rap”和“tomate”)与TABLE 2
比较这些词,如果不存在于这个@987654334 @,DELETE
他们在TABLE 1
我想我有代码的结尾(在表 1 中删除每个单词),但如果表 1 中不存在这些单词,它会错过我的条件...
$stmt_mot_a_sup = mysqli_prepare($BDD_connect, "DELETE FROM Mots_cles SET mots_cles = ? ");
mysqli_stmt_bind_param($stmt_mot_a_sup, "s", $mot_a_sup);
foreach ($tab_tuto_sauvegarde['Mots_cles_supprimes'] as $Mots_cles_supprimes)
$mot_a_sup = $Mots_cles_supprimes;
mysqli_execute($stmt_mot_a_sup);
我不知道如果在表 2 中不存在条件以及在哪里放置条件 > 在表 1 中删除...?
谢谢!
编辑 - 更多信息
这是两张表:
1/ 包含所有关键字数据库的表“Mots_cles”
2/ 表“Mots_cles_et_tutoriels”包含属于每个 id_tutorial 的关键字
我的 POST METHOD $tab_tuto_sauvegarde = $_POST['tableau_valeurs_modifiees'];
返回给我:
1/ 一个 ID(一个数字),例如 90
或 92
或任何与教程对应的...
2/删除表'mots_cles_et_tutoriel'对应ID的几个单词返回给我
所以,首先我像这样删除“Mots_cles_et_tutoriel”表中的这几个词:
if (isset ($tab_tuto_sauvegarde['Mots_cles_supprimes']))
$sql_Mots_cles_id_tutoriel = "";
foreach($tab_tuto_sauvegarde['Mots_cles_supprimes'] as $index => $valeur)
$sql_Mots_cles_id_tutoriel .= "('$id_tutoriel', '$valeur'), ";
if($sql_Mots_cles_id_tutoriel !== "")
$sql_Mots_cles_id_tutoriel = substr($sql_Mots_cles_id_tutoriel, 0, -2); // Supprime la ',' à la fin de la chaine de caractere
mysqli_query($BDD_connect, "DELETE FROM Mots_cles_et_tutoriels WHERE (id_tutoriel, mots_cles) IN (".$sql_Mots_cles_id_tutoriel.")");
然后,我需要的是,如果表“Mots_cles_et_tutoriels”中不再存在此删除的单词(无论id ...),我还需要在表“Mots_cles”中删除(删除所有数据库中的这些单词)。
例如,如果我的 POST 方法返回给我:
id_tutoriel => 92
[Mots_cles_supprimes] => Array
(
[0] => rap
[1] => tyty
[2] => er6
[3] => Kawasaki
)
在“Mots_cles_et_tutoriels”表中,我删除了"rap"
、"tyty"
、"er6"
和"kawasaki"
,其中“id_tutoriel” = 92
我想在“Mots_cles”表中删除 "er6"
和 "kawasaki"
的单词,因为在删除之后,它们不再存在于“Mots_cles_et_tutoriels”表中,这与 "rap"
和 "tyty"
不同已存在于表“Mots_cles_et_tutorials”中。
【问题讨论】:
【参考方案1】:起初:混合阅读英语和法语真的很难 :-) 但我想我明白了。
DELETE FROM TABLE_1 t1
WHERE t1.mots_cles not in (
SELECT t2.mots_cles FROM TABLE_2 t2
)
这个简单的查询表示您要删除 TABLE_1 中的每一行,而 TABLE_2 中没有并发值行。对于更大的数据库,这应该进行优化。
【讨论】:
法语一分:p ...!否则,我已经使用过这种方法并且它有效,但正如你所说,对于更大的数据库,这应该被优化。在不久的将来,表 1 和表 2 将在数据库中包含数千个单词......并且在每个请求(数千小时可能更多......)我不能使用计算机服务器来比较所有表 1 和所有表 2 ...这就是为什么我只需要比较 Ajax 数组中的单词。 能否请您发布您的数据库布局(至少您的索引)。没有这个我不能给出一个好的答案:) 你为什么使用第一个表?也许在第二个上使用 DISTINCT mots_cles 会更好。见w3schools.com/sql/sql_distinct.asp 因为在此之前,客户使用这个现有的关键字数据库创建一个包含不同信息的网页。然后,当客户验证他的所有信息时,他选择的关键字将被赋予页面的 id。但就我而言,我认为 DISTINCT 没有用......以上是关于MySQL - 比较 Ajax 数组中的值,如果不在表中,则删除它们的主要内容,如果未能解决你的问题,请参考以下文章