Нужна поддержка написания MySQL-Query - PullRequest
0 голосов
/ 26 апреля 2011

Я пишу базовый сценарий сообщений на PHP / MySQL, но сейчас я застрял в запросе к базе данных.Буду признателен за любые подсказки или помощь (:

Я использую две таблицы, поскольку сообщение может быть отправлено нескольким пользователям:

messages:
id | sender_id | subject | ...

message_receivers:
message_id | receiver_id | ...

Теперь я хочу отобразитьсообщение для пользователя, которого он выбирает. Но я хочу показать всю историю сообщений, которые имел пользователь в этом разговоре (переход в браузере к тому, который он выбрал). Сделать это с помощью соединения довольно просто:

SELECT * FROM messages
    JOIN message_receivers 
    ON messages.id = message_receivers.message_id
    WHERE sender_id = x
    AND receiver_id = y

Но сейчас мне не хватает информации других получателей сообщения! И я понятия не имею, как получить эту информацию. Есть идеи для этого? (:

Ответы [ 4 ]

1 голос
/ 27 апреля 2011

Присоединитесь к таблице message_receivers еще раз, чтобы получить других получателей сообщения:

SELECT
    m.id, m.sender_id, m.subject,
    r.receiver_id AS recipient,
    c.receiver_id AS carboncopy
FROM messages AS m
INNER JOIN message_receivers AS r
    ON m.id = r.message_id
LEFT OUTER JOIN message_receivers AS c
    ON r.message_id = c.message_id AND r.receiver_id != c.receiver_id
WHERE m.sender_id = x AND r.receiver_id = y

Получатель, который вас интересует, будет в столбце recipient (в каждой записи результата). Другие получатели будут в столбце carboncopy (по одному на запись результата). Если carboncopy равно NULL, то у сообщения был только один получатель.

1 голос
/ 26 апреля 2011

Если вы хотите увидеть всех получателей сообщения, удалите вторую часть предложения were:

AND receiver_id = y

в то же время вы захотите указать message_id, потому что это может ввести пользователя в заблуждение на внешнем интерфейсе

AND message_id = z
0 голосов
/ 26 апреля 2011

вам не нужно ограничивать свой результат значением receive_id = y, не так ли?Также вы можете написать оператор по-другому и легко вернуть идентификаторы получателей:

SELECT m.*, r.receiver_id
FROM messages m, message_receivers r
WHERE m.id = r.message_id
AND m.sender_id = x
0 голосов
/ 26 апреля 2011

Вам не хватает информации о других получателях сообщения из-за классификации:

AND
receiver_id = y

Это ограничивает набор результатов только получателем y.Удалите пункт, и вы получите их все.Однако вы, вероятно, будете получать каждое сообщение, где также sender_id = x, поэтому вам нужно ограничить запрос, указав message_id.

Таким образом, ваш окончательный запрос должен выглядеть примерно так:

SELECT
*
FROM
messages
JOIN message_receivers ON messages.id = message_receivers.message_id
WHERE
sender_id = x
AND
message_id = y
...