2009-11-13 2 views
1

Deuxième question en deux jours sur ce même sujet.Commande par valeur min dans le résultat, tout en respectant le groupement dans mysql

J'utilise actuellement la requête suivante:

SELECT name,suite,webpagetest.id,MIN(priority) AS min_pri 
FROM webpagetest,comparefileerrors 
WHERE vco="aof" AND user="1" AND calibreversion="9" 
AND webpagetest.id=comparefileerrors.id 
AND comparefileerrors.priority IS NOT NULL 
GROUP BY id,suite 
ORDER BY COALESCE(suite,name),min_pri 
ASC ; 

Cela me donne des résultats qui se présentera comme suit:

+-----------------------------+-----------------------------+-------+---------+ 
| name      | suite      | id | min_pri | 
+-----------------------------+-----------------------------+-------+---------+ 
| bz1273_cmdline_execplussvdb | NULL      | 6203 |  2 | 
| bz1508_SEGV_password  | NULL      | 6185 |  2 | 
| bz1747_bad_lvsf    | NULL      | 36683 |  1 | 
| set_get_status    | shortsRepairDB_2009.1_suite | 6193 |  0 | 
| u2uDemo      | shortsRepairDB_2009.1_suite | 6195 |  0 | 
| change_sets     | shortsRepairDB_2009.1_suite | 6194 |  0 | 
| add_delete_mask_polygon  | shortsRepairDB_2009.1_suite | 6191 |  0 | 
| isolate_shorts    | shortsRepairDB_2009.1_suite | 6196 |  0 | 
| add_delete_text    | shortsRepairDB_2009.1_suite | 6197 |  0 | 
| assign_short_AND_user_info | shortsRepairDB_2009.1_suite | 6198 |  2 | 
| comment_short    | shortsRepairDB_2009.1_suite | 6192 |  2 | 
+-----------------------------+-----------------------------+-------+---------+ 

Cependant, ce que je voudrais faire est de les commander par la priorité minimum qui est rencontré dans la suite, s'il y en a un. Suite est un champ optionnel, et s'il est nul, il n'est pas nécessaire de faire ce regroupement. Je veux utiliser la valeur minimale dans la suite pour déterminer l'emplacement global de la suite.

Je suis en train de réfléchir à la refonte de mon application pour utiliser PHP pour faire ce tri, mais pour le moment, ce serait bien de le faire avec mysql.

Les résultats doivent ressembler à ce qui suit:

+-----------------------------+-----------------------------+-------+---------+ 
| name      | suite      | id | min_pri | 
+-----------------------------+-----------------------------+-------+---------+ 
| set_get_status    | shortsRepairDB_2009.1_suite | 6193 |  0 | 
| u2uDemo      | shortsRepairDB_2009.1_suite | 6195 |  0 | 
| change_sets     | shortsRepairDB_2009.1_suite | 6194 |  0 | 
| add_delete_mask_polygon  | shortsRepairDB_2009.1_suite | 6191 |  0 | 
| isolate_shorts    | shortsRepairDB_2009.1_suite | 6196 |  0 | 
| add_delete_text    | shortsRepairDB_2009.1_suite | 6197 |  0 | 
| assign_short_AND_user_info | shortsRepairDB_2009.1_suite | 6198 |  2 | 
| comment_short    | shortsRepairDB_2009.1_suite | 6192 |  2 | 
| bz1747_bad_lvsf    | NULL      | 36683 |  1 | 
| bz1273_cmdline_execplussvdb | NULL      | 6203 |  2 | 
| bz1508_SEGV_password  | NULL      | 6185 |  2 | 
+-----------------------------+-----------------------------+-------+---------+ 
+0

quelle gamme de valeurs auront la priorité? – davethegr8

Répondre

0

Vous pouvez ajouter la priorité la plus basse pour une suite comme une colonne. En supposant que la suite est en WebPagetest et la priorité dans comparefileerrors, quelque chose comme:

SELECT name,suite,webpagetest.id, MIN(priority) AS min_pri, 
    (select min(wt2.priority) 
    from webpagetest wt2 
    inner join comparefileerrors cfe2 
     on wt2.id = cfe2.id 
    where wt2.suite = wt.suite) as suite_min_pri 
FROM webpagetest wt, comparefileerrors cfe 

Et puis utilisez que dans l'ordre par:

ORDER BY COALESCE(suite,name), suite_min_pri 
+0

Merci, c'est exactement la solution que je cherchais. – user210099

0

Si vous avez des valeurs pour priority dans l'intervalle [0, 9], vous pouvez ajouter une autre colonne pour priorité combinée, et que cette valeur soit 10 * (si la suite existe 1: 0) + priorité

SELECT 
    name,suite,webpagetest.id,MIN(priority) AS min_pri 
    (CASE WHEN suite IS NOT NULL THEN 1 ELSE 0 END)*10+priority as combined_pri 
FROM webpagetest,comparefileerrors 
WHERE vco="aof" AND user="1" AND calibreversion="9" 
AND webpagetest.id=comparefileerrors.id 
AND comparefileerrors.priority IS NOT NULL 
GROUP BY id,suite 
ORDER BY COALESCE(suite,name),combined_pri 
ASC ; 

si la priorité est dans un plus grand ensemble de nombres, augmentez simplement le multiplicateur. La clé est d'avoir un chiffre plus grand que la plus grande valeur de priorité.

Questions connexes