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(一个数字),例如 9092 或任何与教程对应的...

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 数组中的值,如果不在表中,则删除它们的主要内容,如果未能解决你的问题,请参考以下文章

比较和替换数组中的值

5.求数组中的最大值

如何将 PHP 数组中的值插入 MySQL 表?

Hashtable一个键多个值 在遍历怎么做啊

jquery ajax上的Textarea没有发送到mysql,只是输入字段

用户键入字母时如何使用 ajax 自动完成来显示 MySQL 数据库中的值