2016-12-15 6 views
1

Как достичь этого швов и группы по или любому другому альтернативномуMysql как выбрать базу по приоритету

Tab 1:

id | data 
1 | aaa 
2 | bbb 
3 | ccc 

Вкладка 2:

id | tab1ID | status 
101 | 1  | Y 
102 | 2  | Y 
103 | 1  | X 
104 | 2  | X 
105 | 3  | X 
106 | 1  | Z 
107 | 2  | Z 

требуется выход:

id | data | status 
1 | aaa | Z 
2 | bbb | Z 
3 | ccc | X 

Запись с наивысшим рейтингом приоритетный статус должен прийти в результате Z > Y > X

Я хочу, чтобы не создавать отдельную таблицу для хранения приоритетного порядка

Edit 1: изменение данных выборки

ответ

0

Если вы хотите самый последний статус, то один метод является коррелированных подзапросов:

select t1.*, 
     (select t2.status 
     from tab2 t2 
     where t2.tab1id = t1.id 
     order by t2.id desc 
     limit 1 
     ) as status 
from tab1 t1; 

EDIT:

Если вы хотите самый высокий статус, используйтеи GROUP BY:

select t1.*, max(t2.status) 
from tab1 t1 left join 
    tab2 t2 
    on t2.tab1id = t1.id 
group by t1.id; 

Примечание: Использование select t1.* разрешается и даже поддерживается стандартом ANSI, при условии, что t1.id является уникальным (разумное предположение).

+0

благодаря @Gordon высоким может возникнуть приоритетный порядок. У меня есть выборка данных, которые вы можете предложить. – Abhi

0

Сначала укажите номер строки во вторую таблицу на основе столбцов tablID и приоритет status. Затем соединить с первой таблицей, чтобы получить столбцы id и data и выбрать только те строки, имеющие номер строки равен 1.

Запрос

 
select t1.`id`, t1.`data`, t2.`status` 
from `tab1` t1 
left join(
    select `id`, `tab1ID`, `status`, 
    (
    case `tab1ID` when @curA 
    then @curRow := @curRow + 1 
    else @curRow := 1 and @curA := `tab1ID` end 
) as rn 
    from `tab2`, 
    (select @curRow := 0, @curA := '') r 
    order by `tab1ID`, case `status` when 'Z' then 1 
        when 'Y' then 2 when 'X' then 3 else 4 end 
)t2 
on t1.`id` = t2.`tab1ID` 
where t2.rn = 1; 

SQL Fiddle Demo