У меня есть такая схема,
message
+------------+----------+
| id | text |
+------------+----------+
| 1 | message1 |
| 2 | message2 |
| 3 | message3 |
+------------+----------+
user_message
+------------+-------------+
| user_id | message_id |
+------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
+------------+-------------+
, поскольку message3 не является владельцем, оно принадлежит всем пользователям.
Итак, у user1 есть message1, message2 и message3,
у user2 есть message2 и message3.
И мне нужно написать sql для запроса сообщений user1,
SELECT
*
FROM
message AS a
JOIN
user_message AS b ON a.id = b.message_id AND b.user_id = 1
UNION ALL
SELECT
*
FROM
message AS a
LEFT JOIN
user_message AS b ON a.id = b.message_id
WHERE
b.user_id IS NULL
Правильно ли это оформление?
Или я должен добавить сообщение3 всем пользователям, как это?
+------------+-------------+
| user_id | message_id |
+------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 1 | 3 |
| 2 | 3 |
+------------+-------------+
Но если у меня новый пользователь, я желаю новогособственное сообщение пользователя3, мне нужно написать дополнительный код для этого.
Как мне сделать это правильно?
РЕДАКТИРОВАТЬ:
Я сделалошибка выше, я проиграл дело, у одного пользователя может быть много сообщений.
Как подсказал Невилл Кайт.
Мне нравится "без сюрпризов".
И я изменяюимя столбца и схема для
сообщения
+------------+----------+
| id | text |
+------------+----------+
| 1 | message1 |
| 2 | message2 |
| 3 | message3 |
+------------+----------+
user_message
+------------+-------------+-------------+
| id | user_id | message_id |
+------------+-------------+-------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | null | 3 |
+------------+-------------+-------------+
Теперь запрос будет
SELECT
*
FROM
user_message AS a
JOIN
message AS b ON a.message_id = b.id
WHERE
user_id = 1 OR user_id IS NULL;