2009-11-13 2 views
1

Второй вопрос в течение двух дней по этой теме.Заказ по минимальному значению в результате, при соблюдении группировки в mysql

я в настоящее время я использую следующий запрос:

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 ; 

Это дает мне результаты, которые выглядят следующим образом:

+-----------------------------+-----------------------------+-------+---------+ 
| 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 | 
+-----------------------------+-----------------------------+-------+---------+ 

Однако то, что я хотел бы сделать, это заказать их по минимальному приоритету который встречается в наборе, если он есть. Suite является необязательным полем, и если он равен нулю, тогда нет необходимости делать эту группировку. Я хочу использовать минимальное значение в наборе, чтобы определить общее размещение пакета.

Я в большой степени рассматриваю возможность переориентации своего приложения на использование PHP для этой сортировки, но для среднего времени было бы неплохо сделать это с помощью mysql.

Результаты должны выглядеть следующим образом:

+-----------------------------+-----------------------------+-------+---------+ 
| 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

Какой диапазон значений будет иметь приоритет? – davethegr8

ответ

0

Вы можете добавить самый низкий приоритет для набора в качестве колонки. Если предположить, что пакет находится в WebPagetest и приоритет в comparefileerrors, что-то вроде:

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 

а затем использовать его в порядке:

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

Спасибо, это именно то решение, которое я искал. – user210099

0

Если у вас есть значения priority в диапазоне [0, 9], вы можете добавить еще один столбец для комбинированного приоритета, и пусть это значение будет 10 * (если свита существует 1: 0) + приоритет

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 ; 

если приоритет в большем наборе чисел, просто увеличьте множитель. Ключ состоит в том, чтобы он был на одну цифру больше, чем наибольшее значение приоритета.

Смежные вопросы