Reputation: 262
I have the following messages table :
What I doing is a chat history, I trying to show all the messages between the two users I have tried different queries but end up only getting the 3 messages that where received by 'E124' but I cant show all 6 messages including the ones that where received by '1'
First attempt
SELECT
m.id,
m.reciever,
m.sender,
m.message,
m.TIME,
m.reciver_read,
r.userID,
r.firstname AS senderName,
r.lastname AS senderSurname,
d.donorCode,
d.firstname AS donorFname,
d.lastname AS donorLname
FROM
messages m
INNER JOIN
recipients r
ON r.userID = m.sender
INNER JOIN
donors d
ON d.donorCode = m.reciever
AND m.reciever = 'E124'
AND r.userID = 1
ORDER BY
m.TIME ASC
produces :
second try
Select m.id,
m.reciever,
m.sender,
m.message,
m.time,
m.reciver_read,
r.userID,
r.firstname As senderName,
r.lastname As senderSurname,
d.donorCode,
d.firstname As donorFname,
d.lastname As donorLname
From messages m
Inner Join recipients r
On r.userID = m.sender
Inner Join donors d
On d.donorCode = m.reciever
Join recipients
On m.reciever = recipients.userID
Where m.reciever = 'E124'
Or m.reciever = 1
And r.userID = 1
Order By m.time Asc;
displays no results at all
I would like help on how can I also get the messages that where received by '1' in a single result?
Upvotes: 2
Views: 76
Reputation: 303
Try this.. hope it helps you..
SELECT
m.id,
m.reciever,
m.sender,
m.message,
m.TIME,
m.reciver_read,
r.userID,
r.firstname AS senderName,
r.lastname AS senderSurname,
d.donorCode,
d.firstname AS donorFname,
d.lastname AS donorLname
FROM
messages m
INNER JOIN recipients r ON r.userID IN(m.sender,m.reciever)
INNER JOIN donors d ON d.donorCode IN(m.sender,m.reciever)
WHERE m.reciever IN('E124','1') AND r.userID = 1
ORDER BY
m.TIME ASC
Upvotes: 3
Reputation: 14746
You should try following query.
SELECT
m.id,
m.reciever,
m.sender,
m.message,
m.TIME,
m.reciver_read,
r.userID,
r.firstname AS senderName,
r.lastname AS senderSurname,
d.donorCode,
d.firstname AS donorFname,
d.lastname AS donorLname
FROM
messages m
INNER JOIN recipients r ON r.userID = m.sender
INNER JOIN donors d ON d.donorCode = m.reciever
AND m.reciever in ('E124')
AND m.sender in ('E124')
AND r.userID = 1
Union All
SELECT
m.id,
m.reciever,
m.sender,
m.message,
m.TIME,
m.reciver_read,
r.userID,
r.firstname AS senderName,
r.lastname AS senderSurname,
d.donorCode,
d.firstname AS donorFname,
d.lastname AS donorLname
FROM
messages m
INNER JOIN recipients r ON r.userID = m.sender
INNER JOIN donors d ON d.donorCode = m.reciever
AND m.reciever in ('1')
AND m.sender in ('1')
AND r.userID = 1
Upvotes: 1
Reputation: 11
You can use IN Clause for this.
SELECT
m.id,m.reciever,m.sender,m.message,m.TIME,
m.reciver_read,r.userID,r.firstname AS senderName,
r.lastname AS senderSurname, d.donorCode,
d.firstname AS donorFname, d.lastname AS donorLname
FROM messages m
INNER JOIN recipients r ON r.userID = m.sender
INNER JOIN donors d ON d.donorCode = m.reciever
AND m.reciever IN('E124','1')
AND r.userID = 1
ORDER BY m.TIME ASC
Upvotes: 0
Reputation: 574
Try this:
SELECT
m.id,
m.reciever,
m.sender,
m.message,
m.TIME,
m.reciver_read,
r.userID,
r.firstname AS senderName,
r.lastname AS senderSurname,
d.donorCode,
d.firstname AS donorFname,
d.lastname AS donorLname
FROM
messages m
INNER JOIN
recipients r ON r.userID = m.sender
INNER JOIN
donors d ON d.donorCode = m.reciever
WHERE
m.sender = '1' AND m.reciever = 'E124' OR
m.sender = 'E124' AND m.reciever = '1'
ORDER BY
m.TIME ASC
Upvotes: 1
Reputation: 117
Try using lime this:
(m.reciever = 'E124'
Or m.reciever = 1)
And r.userID = 1
Upvotes: 0
Reputation: 795
Maybe:
FROM messages m
JOIN recipients r
ON r.userID = m.sender
AND (m.reciever = 'E124' OR m.reciever = '1')
AND (m.sender = 'E124' OR m.sender = '1')
LEFT JOIN donors d
ON d.donorCode = m.reciever
AND d.donorCode = 'E124'
Upvotes: 1