2013-03-04 5 views
1

J'ai aujourd'hui une base de données avec 3 requêtes pour les statistiques dans les cas de test. J'utilise php pour créer un site web mais les requêtes sont trop longues à exécuter, donc je ne peux pas afficher les statistiques complètes du site comme je ne le ferais pas. Comme il est maintenant la base de données est rarement mise à jour par lots afin que je puisse faire des événements qui met à jour les bases de données quotidienne/hebdomadaire à cette fin.Requête d'insertion SQL imbriquée

J'ai les 3 requêtes suivantes aujourd'hui pour afficher les informations que je veux:

SELECT key FROM testcase GROUP BY key; 

Cela me donne une liste int de 4-10 groupes de tests. disons 1,2,3,4 pour le cas de l'argument. J'itérer alors ce dans les sous-requêtes comme clé pour obtenir le nombre de tests passés et le nombre de tests non passés avec les 2 requêtes suivantes:

SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON 
    testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%; 

et

SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON 
    testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%; 

Voici comment cela fonctionne aujourd'hui . Les requêtes prennent environ 25 à 30 secondes pour chaque clé, ce qui entraîne l'expiration du site. Au lieu de cela, je pensais à une requête sql qui l'a ajoutée à une table de base de données composée de tables clés, pass, fail que je remplis tous les jours/toutes les semaines. montrer sur le site comme des statistiques. J'ai vu quelques cas où vous pouvez itérer avec une sous-requête mais comme les 2 requêtes exécutées sont opposées, je ne vois aucune solution pour cela.

J'ai essayé d'indexer les valeurs que j'utilise dans les requêtes sans succès (ce qui pourrait également être faux).

// Andreas (de novice SQL)

Edit:

Oh le dilemme, où fixer la solution, je fait une moissonneuse-batteuse de Gordon et Joe pour faire la requête la plus rapide qui a fonctionné comme un charme:

INSERT INTO statistics (key,passed,failed) 
    SELECT 
    key, 
    SUM(case when T.pass = 1 then T.matches else 0 end) as passed, 
    SUM(case when T.pass = 0 then T.matches else 0 end) as failed 
    FROM 
    (SELECT 
     key,pass,COUNT(*) AS matches 
    FROM testcase INNER JOIN testcases ON 
     testcase.ID = testcases.testcaseid 
    GROUP BY key,pass)T 
    GROUP BY key 

Répondre

1

Je pense que vous devriez faire tout cela avec une requête, qui renvoie la clé et les informations que vous souhaitez:

select key, 
     SUM(case when pass = 1 AND key = %value% then 1 else 0 end) as passed, 
     SUM(case when pass = 0 AND key = %value% then 1 else 0 end) as failed 
from testcase INNER JOIN testcases ON 
     testcase.ID = testcases.testcaseid 
group by key 

Dans la mesure du possible, vous devez laisser la base de données ne les « itérations » et juste lire sauvegarder les données résultantes.

En réponse à votre commentaire. Si vous avez une liste des clés de la valeur $, alors vous pourriez faire:

insert into statistics(key, pass, fail) 
    select key, 
      SUM(case when pass = 1 then 1 else 0 end) as passed, 
      SUM(case when pass = 0 then 1 else 0 end) as failed 
    from testcase INNER JOIN testcases ON 
     testcase.ID = testcases.testcaseid 
    where concat(',', $VALUE, ',') like concat('%', key, '%') 
    group by key 

Ou, si vous générez la requête, vous pouvez mettre la liste dans une clause in.Ainsi, le where pourrait ressembler à:

where key in (2, 3, 4, 5) 
+0

est-il possible d'insérer la clé dans le slot% value% en utilisant la requête sql? Je pense quelque chose dans le sens de INSERT dans statistcis (key, pass, fail) suivi de cette requête. – Andreas

+0

hmm, Le second semble prometteur, mais je reçois un délai dans phpMyAdmin, je vais essayer de travailler demain avec mysqlquerybrowser et un accès direct. ajouté la requête _where (clé SELECT FROM testcase GROUP BY clé) _ et en essayant cela. – Andreas

1

Essayez:

select key, pass, count(*) from testcase group by key, pass 

Un index sur pass va être inutile. Index sur key, cela devrait aider un peu. Mais avec une cardinalité de 4-10, ne va pas être super utile.

+0

fonctionne assez bien pour obtenir la liste, encore une étape d'insérer dans un tableau de statistiques. Je vais voir si je peux obtenir un meilleur retour en utilisant cette requête et itérer en php. – Andreas