简体   繁体   English

MySQL-提高查询性能

[英]MySQL - Improve Query Performance

I have a POST METHOD $tab_tuto_sauvegarde = $_POST['tableau_valeurs_modifiees']; 我有一个POST方法$tab_tuto_sauvegarde = $_POST['tableau_valeurs_modifiees']; who with a Ajax request returns to me this kind of informations : 谁收到Ajax请求后会向我返回此类信息:

(
    [Categories] => Array
        (
            [Cat_1] => AA
            [Cat_2] => DD
        )
)

But it can be that or other... 但这可能是其他...

 (
        [Categories] => Array
            (
                [Cat_1] => CC
                [Cat_2] => HH
                [Cat_3] => AA
            )
    )

I have a TABLE named 'Groupe_Categories' 我有一个名为'Groupe_Categories'的表

|  id_groupe_categorie  ||  titre_categorie_nv1 |  titre_categorie_nv2 |  titre_categorie_nv3 |
______________________________________________________________________________________________
|    1                  ||         AA           |         DD          |                     |
|    2                  ||         AA           |         EE          |         RR          |
|    3                  ||         BB           |         FF          |         FF          |
|    4                  ||         CC           |         HH          |         AA          |
...

And an other TABLE named Wheel 还有另一个名为Wheel

|  id_wheel  ||  id_groupe_categorie 
_____________________________________
|    1       ||         1          
|    2       ||         5           
|    3       ||         9           
|    4       ||         11         
...

What I do is in function of [Cat_1] , [Cat_2] ... match the 'id_groupe_categorie' in TABLE 'Groupe_Categories' and UPDATE this 'id_groupe_categorie' in TABLE Wheel 我要做的就是在函数[Cat_1] [Cat_2] ...匹配'id_groupe_categorie''Groupe_Categories'并更新此'id_groupe_categorie'Wheel

In the 1st example the result is 1 In the 2nd example the result is 4 在第一个示例中,结果为1在第二个示例中,结果为4

For that I made this code : 为此,我编写了以下代码:

if (isset ($tab_tuto_sauvegarde['Categories'])){

    $cat1 = $tab_tuto_sauvegarde['Categories']['Cat_1'];
    $cat2 = $tab_tuto_sauvegarde['Categories']['Cat_2'];

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_3'])){
        $titre_cat3 = $tab_tuto_sauvegarde['Categories']['Cat_3'];
        $column_cat3 = "titre_categorie_nv3" ;
        $cat3 = "AND $column_cat3 = '$titre_cat3'" ;
    }else $cat3 = "";

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_4'])){
        $titre_cat4 = $tab_tuto_sauvegarde['Categories']['Cat_4'];
        $column_cat4 = "titre_categorie_nv4" ;
        $cat4 = "AND $column_cat4 = '$titre_cat4'" ;
    }else $cat4 = "";

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_5'])){
        $titre_cat5 = $tab_tuto_sauvegarde['Categories']['Cat_5'];
        $column_cat5 = "titre_categorie_nv5" ;
        $cat5 = "AND $column_cat5 = '$titre_cat5'" ;
    }else $cat5 = "";

    $stmt_cat = mysqli_query($BDD_connect, "SELECT id_groupe_categorie FROM Groupe_de_categories WHERE titre_categorie_nv1 = '$cat1' AND titre_categorie_nv2 = '$cat2' '$cat3' '$cat4' '$cat5'");
    //$stmt_cat = replace($stmt_cat, '\'\'', '');

    $row_stmt_cat = mysqli_fetch_assoc($stmt_cat);
    $id_gpe_cat = $row_stmt_cat['id_groupe_categorie'];

    mysqli_query($BDD_connect, "UPDATE Tutoriels SET id_groupe_categorie = '$id_gpe_cat', niveau_choix_categorie_autre ='', categorie_autre='' WHERE id_tutoriel = '$id_tutoriel'"); 
}

First, this code works but I think he is very heavy... Is there a way to simplify the code ? 首先,此代码有效,但我认为他很沉重...有没有办法简化代码?

Secondly, with my code, if [Cat_3] doesn't exist like in my 1st example, in "SELECT id_groupe_categorie FROM Groupe_de_categories WHERE titre_categorie_nv1 = '$cat1' AND titre_categorie_nv2 = '$cat2' '$cat3' "); 其次,在我的代码中,如果[Cat_3]不像我的第一个示例那样存在,则在"SELECT id_groupe_categorie FROM Groupe_de_categories WHERE titre_categorie_nv1 = '$cat1' AND titre_categorie_nv2 = '$cat2' '$cat3' "); '$cat3' is replace by floating ' ' ... it works but how can I delete this floating '' ? '$cat3'被浮动' '代替...有效,但是如何删除该浮动''

Thanks for your help ! 谢谢你的帮助 !

This code should solve both of your "problems": 此代码应解决您的两个“问题”:

if (isset ($tab_tuto_sauvegarde['Categories'])){

    $cat1 = $tab_tuto_sauvegarde['Categories']['Cat_1'];
    $cat2 = $tab_tuto_sauvegarde['Categories']['Cat_2'];

    $sSelect = "SELECT id_groupe_categorie FROM Groupe_de_categories WHERE titre_categorie_nv1 = '$cat1' AND titre_categorie_nv2 = '$cat2'";

    $i = 3;
    while ($i < 6) {
        if (isset ($tab_tuto_sauvegarde['Categories']['Cat_'.$i])){
            $titre_cat = $tab_tuto_sauvegarde['Categories']['Cat_'.$i];
            $column_cat = "titre_categorie_nv".$i ;
            $sSelect .= " AND $column_cat = '$titre_cat' " ;
        }
        $i++;
    }

    $stmt_cat = mysqli_query($BDD_connect, $sSelect);
    //$stmt_cat = replace($stmt_cat, '\'\'', '');

    $row_stmt_cat = mysqli_fetch_assoc($stmt_cat);
    $id_gpe_cat = $row_stmt_cat['id_groupe_categorie'];

    mysqli_query($BDD_connect, "UPDATE Tutoriels SET id_groupe_categorie = '$id_gpe_cat', niveau_choix_categorie_autre ='', categorie_autre='' WHERE id_tutoriel = '$id_tutoriel'"); 
}

to short your code you can use for loop in his way: 为了缩短您的代码,您可以按以下方式使用for循环:

for($i=1;$i<=5;$i++) {
      ${cat_ . $i} = (isset($tab_tuto_sauvegarde['Categories']["Cat_".$i]) ? $tab_tuto_sauvegarde['Categories']["Cat_".$i] : "");
}

As I see if the array item is not isset you want to create an empty variable for it. 如我所见,如果未设置数组项,则要为其创建一个空变量。 The code above will do it for you. 上面的代码将为您完成此任务。

You can change in your code this: 您可以这样更改代码:

    $cat1 = $tab_tuto_sauvegarde['Categories']['Cat_1'];
    $cat2 = $tab_tuto_sauvegarde['Categories']['Cat_2'];

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_3'])){
        $titre_cat3 = $tab_tuto_sauvegarde['Categories']['Cat_3'];
        $column_cat3 = "titre_categorie_nv3" ;
        $cat3 = "AND $column_cat3 = '$titre_cat3'" ;
    }else $cat3 = "";

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_4'])){
        $titre_cat4 = $tab_tuto_sauvegarde['Categories']['Cat_4'];
        $column_cat4 = "titre_categorie_nv4" ;
        $cat4 = "AND $column_cat4 = '$titre_cat4'" ;
    }else $cat4 = "";

    if (isset ($tab_tuto_sauvegarde['Categories']['Cat_5'])){
        $titre_cat5 = $tab_tuto_sauvegarde['Categories']['Cat_5'];
        $column_cat5 = "titre_categorie_nv5" ;
        $cat5 = "AND $column_cat5 = '$titre_cat5'" ;
    }else $cat5 = "";

To this: 对此:

for($i=1;$i<=5;$i++) {
${cat_ . $i} = (isset($tab_tuto_sauvegarde['Categories']["Cat_".$i]) ? $tab_tuto_sauvegarde['Categories']["Cat_".$i] : "");
}

To understand it I wrote a standalone sample code for you, because i didn't know your full code, so try to experiment with this small code snippet :-) 为了理解它,我为您编写了一个独立的示例代码,因为我不知道您的完整代码,因此请尝试使用此小代码段:-)

<?
$array1 = array();
$array1["Cat_1"] = "cc";
$array1["Cat_2"] = "dd";
$array1["Cat_3"] = "rr";


for($i=1;$i<=4;$i++) {
${cat_ . $i}    = (isset($array1["Cat_".$i]) ? $array1["Cat_".$i] : "-");

}
echo $cat_1;
echo $cat_2;
echo $cat_3;
echo $cat_4;
?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM