簡體   English   中英

MySQL-提高查詢性能

[英]MySQL - Improve Query Performance

我有一個POST方法$tab_tuto_sauvegarde = $_POST['tableau_valeurs_modifiees']; 誰收到Ajax請求后會向我返回此類信息:

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

但這可能是其他...

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

我有一個名為'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          |
...

還有另一個名為Wheel

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

我要做的就是在函數[Cat_1] [Cat_2] ...匹配'id_groupe_categorie''Groupe_Categories'並更新此'id_groupe_categorie'Wheel

在第一個示例中,結果為1在第二個示例中,結果為4

為此,我編寫了以下代碼:

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

首先,此代碼有效,但我認為他很沉重...有沒有辦法簡化代碼?

其次,在我的代碼中,如果[Cat_3]不像我的第一個示例那樣存在,則在"SELECT id_groupe_categorie FROM Groupe_de_categories WHERE titre_categorie_nv1 = '$cat1' AND titre_categorie_nv2 = '$cat2' '$cat3' "); '$cat3'被浮動' '代替...有效,但是如何刪除該浮動''

謝謝你的幫助 !

此代碼應解決您的兩個“問題”:

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

為了縮短您的代碼,您可以按以下方式使用for循環:

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

如我所見,如果未設置數組項,則要為其創建一個空變量。 上面的代碼將為您完成此任務。

您可以這樣更改代碼:

    $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 = "";

對此:

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

為了理解它,我為您編寫了一個獨立的示例代碼,因為我不知道您的完整代碼,因此請嘗試使用此小代碼段:-)

<?
$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