Данные MySQL из 3 таблиц - PullRequest
1 голос
/ 20 мая 2011

У меня есть три таблицы MySQL, которые относятся к системе обмена сообщениями.Схема и примеры данных показаны ниже для каждой таблицы, относящейся к моему вопросу:

`messages`:
+----+---------+----------+
| id | subject | senddate |
+----+---------+----------+
| 1  | Testing | 12344555 |
+----+---------+----------+

`message_senders`:
+------------+---------+---------+
| message_id | user_id | trashed |
+------------+---------+---------+
|      1     |    1    |    1    |
+------------+---------+---------+

`message_recipients`:
+------------+---------+------+----------+---------+
| message_id | user_id | type | readdate | trashed |
+------------+---------+------+----------+---------+
|      1     |    1    |  to  | 12344555 |    1    |
+------------+---------+------+----------+---------+
|      2     |    1    |  cc  | 12344555 |    1    |

Мой вопрос заключается в том, как бы выбрать все сообщения, отправленные или полученные пользователем, где для параметра trashed установлено значение 1без выбора дубликатов сообщений.Например, рассмотрим следующий сценарий:

Я хочу получить идентификаторы сообщений для всех сообщений, разбитых на user_id 1, но я не хочу получать дубликаты идентификаторов (в приведенных выше данных, например, user_id 1 является отправителем И получателем message_id 1. Я не хочу возвращать message_id из 1 дважды, но хочу получить все сообщения для этого пользователя.

Я думаю, что мне нужноиспользуйте комбинацию JOIN и UNION, но мой мозг не работает после долгого дня PHP!

Ответы [ 4 ]

1 голос
/ 20 мая 2011

Попробуйте и посмотрите, вернет ли он только одну строку для каждого сообщения в таблице сообщений ...

    select * from messages 
left join message_senders on messages.id = message_senders.message_id 
left join message_recipients on messages.id = message_recipients.message_id 
where message_senders.trashed = 1 or message_recipients.trashed = 1 and messages.user_id = <value>
0 голосов
/ 20 мая 2011

Вот, пожалуйста, сделайте снимок:

select distinct m.id
from messages m
left join message_senders s on m.id = s.message_id
left join message_recipients r on m.id = r.message_id
where ((s.user_id = 1 and s.trashed = 1) or (r.user_id = 1 and r.trashed = 1))
0 голосов
/ 20 мая 2011

Предполагая, что вы запомнили запрос - я просто намекну, что вы можете использовать ключевое слово DISTINCT, чтобы БД не возвращала дубликаты.Я уверен, что вы можете решить это самостоятельно, потому что самооценка работает лучше всего.

Кроме того, совет - всегда храните даты как datetime или date вместо int.Вы избегаете проблем с переходом на летнее время и можете использовать различные функции даты, предоставляемые MySQL.Даты сохраняются внутри как 4-байтовые целые числа, так же как int поля.

0 голосов
/ 20 мая 2011

Решение, которое приходит мне в голову, заключается в использовании подзапроса UNION d:

SELECT DISTINCT * FROM messages WHERE id IN (
    (SELECT message_id FROM message_recipients WHERE user_id=1 AND trashed=1)
  UNION
    (SELECT message_id FROM message_senders WHERE user_id=1 AND trashed=1)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...