2014-01-17 3 views
0

у меня подзапрос в очень большом запросе, который должен сделать следующийзапросов с двумя дополнительными значениями для каждой строки

с массивом пара кластеров

массива (массив (с1, с2), массив (с3, с4), массив (с5, с6), массив (С7, С8))

, где, например, C1 и C2 дополняют друг друга, с3 и с4, а также ..etc. и у меня есть состояние таблицы:

id_state cluster successfull failed success_ratio 
    1  c1   4   0  100% 
    2  c2   1   9  10% 
    3  c3   0   4  0%   
    4  c4   1   1  50% 

Обратите внимание, что кластер, который в сочетании с другим определяется с использованием массива выше.

и окончательный вывод, что я хотел бы иметь:

cluster successfull success_ratio       
     c1   4  100% (for the first pair) 
     c4   1  50%  (for the second) 

есть способ сделать запрос, который получает success_ratio всех данных, принимая только из каждой пары один с success_ratio > 50%, и только если оба имеют success_ratio < 50%, то просто возьмите первый.

Возможно ли это даже при использовании только запроса mysql (я не могу использовать результат запроса, так как я хочу, чтобы он был как подзапросом другого большого запроса)?

, даже если вы можете просто предложить отправную точку для способа сделать это, что было бы оценено.

+0

Что делать, если оба имеют успех рационов больше чем на 50%? –

+0

Можете ли вы привести пример желаемого ввода и вывода? –

+0

@ gordon-linoff, тогда я должен просто взять первый коэффициент успеха –

ответ

1

Похоже, вы просто хотите получить максимальный коэффициент успеха для каждой пары.

select s.grp, max(success_ratio) 
from state s join 
    (select 'c1' as cluster, 1 as grp union all 
     select 'c2', 1 union all 
     select 'c3', 2 union all 
     select 'c4', 2 union all 
     select 'c5', 3 union all 
     select 'c6', 3 union all 
     select 'c7', 4 union all 
     select 'c8', 4 
    ) grps 
    on s.cluster = grps.cluster 
group by s.grp; 

Если вы на самом деле хотите, чтобы строки с лучшим успехом, а затем использовать подзапрос:

select s.* 
from (select s.grp, 
     substring_index(group_concat(cluster order by success_ratio desc), ',', 1) as bestcluster 
     from state s join 
      (select 'c1' as cluster, 1 as grp union all 
      select 'c2', 1 union all 
      select 'c3', 2 union all 
      select 'c4', 2 union all 
      select 'c5', 3 union all 
      select 'c6', 3 union all 
      select 'c7', 4 union all 
      select 'c8', 4 
      ) grps 
      on s.cluster = grps.cluster 
     group by s.grp 
    ) b join 
    state s 
    on s.cluster = b.cluster 
+0

спасибо @ gordon-linoff, очень полезный ответ, указал мне в правильном направлении –

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