mysql - How to "remove duplicates" from a UNION query -


i have 2 tables in mysql: 1 called gtfsws_users contains users system i'm developing , called gtfsws_repository_users contains roles these users.

gtfsws_users has these fields: email, password, name, is_admin , enabled. gtfsws_repository_users has: user_email, repository_id , role.

the role integer defines privileges on gtfs repository (public transportation data, not relevant problem).

one important thing every administrator accont (that is, every user has is_admin flag set 1 in gtfsws_users) has full access repositories.

now, users registered in gtfsws_repository_users have access specific repository defined there (unless administrators, of course). 1 user can have multiple repositories him/her can access.

what i'm trying all users access specific repository (it doesn't matter type of role user has, want know if can access repository or not). i'm writing sql statement getting them:

(     select distinct         gtfsws_users.email email,         gtfsws_users.name name,         gtfsws_users.is_admin is_admin,         gtfsws_users.enabled enabled,         gtfsws_repository_users.role role             gtfsws_users     inner join         gtfsws_repository_users     on         gtfsws_users.email = gtfsws_repository_users.user_email             gtfsws_repository_users.repository_id = '2' ) union (     select         email,         name,         is_admin,         enabled,         null role             gtfsws_users             is_admin = 1 ) 

now, works fine users access different repositories. gets administrators too.

the problem when have administrator registered in gtfsws_repository_users, because duplicated.

so example, have in gtfsws_users:

('test@test.com', '*****', 'real name', 1, 1)

and user registered in gtfsws_repository_users this:

('test@test.com', 2, 10)

when select in mysql (using union add administrators) get:

('test@test.com', 'real name', 1, 1, 10) ('test@test.com', 'real name', 1, 1, null) 

what need filter table remove duplicates, getting only:

('test@test.com', 'real name', 1, 1, null) 

yes, getting null role (since ignored user administrator).

does have clue on how achieve that? lot.

edit: ok, katrin's suggestion, i'm getting progress. 1 row, it's 1 role number defined. way preserve 1 null role instead of defined one?

since aggregate functions ignore null values, can convert null number can extracted min or max.
assuming roles greater 0:

select email, name, is_admin, enabled, nullif(min(coalesce(role, 0)), 0) role ((     select distinct         gtfsws_users.email email,         gtfsws_users.name name,         gtfsws_users.is_admin is_admin,         gtfsws_users.enabled enabled,         gtfsws_repository_users.role role             gtfsws_users     inner join         gtfsws_repository_users     on         gtfsws_users.email = gtfsws_repository_users.user_email             gtfsws_repository_users.repository_id = '2' ) union (     select         email,         name,         is_admin,         enabled,         null role             gtfsws_users             is_admin = 1 )) q group email, name, is_admin, enabled 

Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -