Here's one possible solution:
First I just set up your tables:
DROP TEMPORARY TABLE IF EXISTS messages;
CREATE TEMPORARY TABLE messages (
message_id INT,
language_id INT,
message VARCHAR(64)
);
INSERT INTO messages VALUES
(1, 1, "Hello"),
(1, 2, "Hellode"),
(1, 3, "Hola"),
(2, 1, "Goodbye"),
(2, 3, "Adios");
And adds a new for language preference:
DROP TEMPORARY TABLE IF EXISTS user_language_preference;
CREATE TEMPORARY TABLE user_language_preference (
user_id INT,
language_id INT,
preference INT
);
INSERT INTO user_language_preference VALUES
(1, 1, 10), # know english
(1, 2, 100); # but prefers 'de'
And the queries..
Hello:
SET @user_id = 1;
SET @message_id = 1;
# Returns 'Hellode', 'Hello'
SELECT
m.language_id,
message
FROM messages AS m, user_language_preference AS l
WHERE message_id=@message_id
AND m.language_id=l.language_id
AND user_id=@user_id
ORDER BY preference DESC;
Goodbye:
SET @message_id = 2;
# Returns 'Goodbye' as 'de' doesn't have a message there
SELECT
m.language_id,
message
FROM messages AS m, user_language_preference AS l
WHERE message_id=@message_id
AND m.language_id=l.language_id
AND user_id=@user_id
ORDER BY preference DESC;
Edit: In response to the comment:
SELECT
m.message_id,
m.language_id,
message
FROM messages AS m, user_language_preference AS l
WHERE m.language_id=l.language_id
AND user_id=@user_id
ORDER BY m.message_id, preference DESC;