2014-01-24 8 views
0

У меня есть дизайн, как этотMysql возвращает имя таблицы идентификатор существует в

accounts(id, username, email, password, ..) 
admin_accounts(account_id, ...) 
user_accounts(account_id, ....) 
premium_accounts(account_id, ....) 

идентификатор является первичным ключом в счетах
account_id является иностранным (ссылки ID на таблицу счетов) и первичный ключ эти три таблицы (admin, user, premium)

Зная идентификатор, как я могу найти, какого типа у этого пользователя есть только один запрос? Кроме того, зная, что идентификатор может существует только в одном из трех таблиц (администратор, пользователь, премиум)

ответ

0

Использование case:

select 
    a.id, 
    case 
    when aa.account_id is not null then 'admin_accounts' 
    when ua.account_id is not null then 'user_accounts' 
    when pa.account_id is not null then 'premium_accounts' 
    else 
    'No detail found' 
    end as found_in 
from 
    accounts a 
    left join admin_accounts aa on aa.account_id = a.id 
    left join user_accounts ua on ua.account_id = a.id 
    left join premium_accounts pa on pa.account_id = a.id 
/*where -- In case you want to filter. 
    a.id = ....*/ 

использованием union

select 
    id, 
    found_in 
from 
    (select account_id as id, 'admin_accounts' as found_in 
    from admin_accounts aa 
    union all 
    select account_id, 'user_accounts' 
    from user_accounts ua 
    union all 
    select account_id, 'premium_accounts' 
    from premium_accounts pa) a 
/*where -- In case you want to filter. 
    a.account_id = ....*/ 
+0

Мне нравится это решение, спасибо. –

0

Вы можете использовать накидной запрос как

(select id, 'admin' as user_type from account inner join admin_accounts) UNION 
(select id, 'user' as user_type from account inner join user_accounts) UNION 
(select id, 'premium' as user_type from account inner join premium_accounts); 
+0

'union all' будет быстрее. – GolezTrol

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