2010-07-23 4 views
0

donc mon code fonctionne mais ce n'est pas très rapide quand j'ai un $ id avec une grande quantité d'applicationID et j'ai peur que cette table va juste croître et grandir.est-ce que quelqu'un voit comment je peux rendre cela plus efficace?

$x = '0'; 
$y = '0'; 
$query0 = "SELECT applicationID 
    FROM app 
    WHERE schoolID='$id'"; 
$result0 = mysql_db_query($aidDB, $query0, $connection); 
while ($r0 = mysql_fetch_array($result0)) { 
    $query = "SELECT App_Last, App_First, applicationID 
    FROM applicant 
    WHERE (App_Last IS NOT NULL OR App_First IS NOT NULL) AND applicationID='" . $r0['0'] . "'"; //echo $query; 
    $result = mysql_db_query($aidDB, $query, $connection); 
    while ($r = mysql_fetch_array($result)) { 
     //$temp_array[$x][0]=$r[2];//appid*/ 
     $query1 = "SELECT DISTINCT applicationID 
    FROM OrderTrack 
    WHERE applicationID='" . $r['2'] . "'"; //echo $query1; 
     $result1 = mysql_db_query($aidDB, $query1, $connection); 
     while ($r1 = mysql_fetch_array($result1)) { 
      $temp_array1[$y][0] = "<option name=appid value=\"" . $r1['0'] . "\">" . $r['1'] . "," . $r['0'] . "</option>"; 
      $temp_array[$x][0] = $r1[0]; //appid cause it to count the distinct amount on customer names may need to change to appid 
      $x ++; 
      $y ++; 
     } 
    } 
} 
} 
+0

Veuillez décrire les tableaux et leurs relations. On dirait que tu pourrais les rejoindre. –

+0

bien im en utilisant la table de l'application pour obtenir l'ID de l'application basée sur schoolID afin qu'il réduit le nombre d'ApplicationID, il doit passer par. . Ensuite, je sélectionne le app_fisrt app_last du demandeur dans la table du demandeur en fonction de l'application ID Pull de la table des applications. la dernière requête prend l'application de l'applicateur et bloque la carte de commande pour la voir il y a un enregistrement. s'il y a un . la table d'application est la seule table qui a un schoolID feild toutes les tables ont cependant une applicationID qui est la même sur toute la ligne – mike

Répondre

1

Oui, vous pouvez retirer l'excès de corset à la fin. Cela changerait le script de ne pas être en cours d'exécution;)

Vous devriez également envisager d'utiliser des instructions préparées pour corriger les vecteurs d'attaque SQL Injection dans votre requête. En outre, vous pourriez être en mesure d'utiliser un JOIN pour aller chercher les données en une fois au lieu de trois.

Une autre suggestion serait de séparer le bâtiment HTML et la récupération les uns des autres. Cela ne le rendrait pas plus efficace, mais plus lisible et maintenable.

1

Les requêtes imbriquées ne sont jamais un bon moyen de coder. Ils sont, comme vous l'avez constaté, lents. Si vous pouvez extraire les données dans une requête, ce que vous devriez pouvoir faire, cela améliorera considérablement la rapidité et l'efficacité de vos codes.

Un exemple, non testé de toute évidence.


$query = "SELECT DISTINCT applicationID, App_Last, App_First 
FROM app a 
    JOIN applicant ap ON a.applicationID = ap.ApplicationID 
    JOIN OrderTrack ot ON a.applicationID = ot.applicationID 
WHERE (ap.App_Last IS NOT NULL OR ap.App_First IS NOT NULL) AND a.schoolID = '$id'"; 

De cette façon, vous ne devriez avoir une requête pour tout cela, ce qui signifie que 1 boucle, et 1 requête tirée à partir du serveur MySQL. Espérons que cette requête fonctionne, sinon essayer et réessayer, il devrait l'aider.

0

Vous pouvez réécrire 3 requêtes en 1.
$query = "SELECT DISTINCT app.applicationID, a.App_Last, a.App_First
FROM app ap
INNER JOIN applicant a ON (a.applicationID = app.applicationID AND App_Last IS NOT NULL OR App_First IS NOT NULL)
INNER JOIN OrderTrack o ON (o.applicationID = a.applicationID)
WHERE ap.schoolID='".mysql_real_escape_string($id)."'

Maintenant, vous avez juste besoin de 1 boucle et 1 appel à mysql_db_query.

0

vous devez faire un peu de rejoindre ....

essayer quelque chose comme: Sélectionnez applicationId Distinct de l'application INNER JOIN requérant, applicant.applicationID = app.applicationID INNER JOIN commandeSuivre ON applicant.applicationID = OrderTrack.applicationID OÙ App_Last IS NOT NULL OU App_First IS NOT NULL et SCHOOLID = {id}

.... et ensuite en boucle votre jeu de résultats

AVERTISSEMENT: Comme je viens de le fouet jusqu'à très rapide, je ne crée pas les tables et test. En outre, les conventions de nommage sont un peu bizarre et je ne peux pas voir vos tables entières .... mais cela devrait fonctionner à moins que j'ai fait une erreur de logique flagrante.

+0

im essayant cela mais semble que quelque part theres une erreur de nommage et j'obtiens # 1109 - table inconnue 'app' dans la liste des champs lorsque je lance la déclaration. je ne sais pas pourquoi vous utilisez ap dans le feild – mike

+0

avec votre déclaration je reçois # 1052 - Colonne 'applicationID' dans la liste des champs est ambigu – mike

+0

bon point ... il suffit de le changer à 'SELECT DISTINCT app.applicationId'. En ce qui concerne la table 'app', je basais cela sur la table sélectionnée dans $ query0 de votre code de question. – smp7d

Questions connexes