Edited to add alternative solutions appropriate to the nature of the issue .: D
(FWIW: second choice was my first implementation)
First choice
This one should be able to provide better performance, although a little harder to follow.
More importantly, however, it best includes 4, 5, 6, etc. Languages. The solution requires a temporary table that determines the priority of languages ββ(it is better to use any method in mysql).
The solution meat is in the search subquery; once he has determined the best available language to choose, a simple connection to receive the actual messages.
declare @prio table (prio_id int, lid varchar(5)) insert into @prio values(1, 'de') insert into @prio values(2, 'en') insert into @prio values(3, 'es') select m.* from ( select message_id, MIN(prio_id) prio_id from @messages m inner join @Prio p on p.lid = m.language_id group by message_id ) finder inner join @Prio p on p.prio_id = finder.prio_id inner join @messages m on m.message_id = finder.message_id and m.language_id = p.lid
Second choice
The following query structure should be simple enough to follow. Each union adds a message identifier to the result set not yet in the result set.
UNION ALL is sufficient because each subsequent request does not guarantee duplication.
An index on (language_id, message_id) should offer better performance (especially if it's grouped).
select message_id, language_id, message from messages where language_id = 'de' union all select message_id, language_id, message from messages where language_id = 'en' and message_id not in (select message_id from messages where language_id in ('de')) union all select message_id, language_id, message from messages where language_id = 'es' and message_id not in (select message_id from messages where language_id in ('de', 'en'))
Third choice
This is an interpolation using the COALESCE function.
However, I do not expect it to work well on large amounts of data.
select *, COALESCE( (select language_id from @messages where message_id = m.message_id and language_id = 'de'), (select language_id from @messages where message_id = m.message_id and language_id = 'en'), (select language_id from @messages where message_id = m.message_id and language_id = 'es') ) language_id, COALESCE( (select message from @messages where message_id = m.message_id and language_id = 'de'), (select message from @messages where message_id = m.message_id and language_id = 'en'), (select message from @messages where message_id = m.message_id and language_id = 'es') ) message from ( select distinct message_id from @messages ) m