我有一个消息应用程序,我想显示像facebook这样的消息,它应该由发件人或收件人获取最后一封发送消息,我的表格布局是这样的:
messages_tbl
__________________________________________________________________________
|id | user1Fk| user2Fk |subject | user1Delete | user2Delete | dateCreated |
和我的user_tbl
_______________________________________
| id | first_name | last_name | image |
我的查询
SELECT `id` , `user1Fk` as sender_id,
(SELECT concat(first_name,\" \",last_name)
FROM user_tbl
WHERE user_tbl.id = sender_id
) as senderName,
`user2Fk` as recipient_id ,
(SELECT concat(first_name,\" \",last_name)
FROM user_tbl
WHERE user_tbl.id = recipient_id
) as recipientName,
(SELECT image
FROM user_tbl
WHERE user_tbl.id = sender_id
) as senderImage,
(SELECT image
FROM user_tbl
WHERE user_tbl.id = recipient_id
) as recipientImage,
`subject`, `message`, `user1Delete`, `user2Delete`,
`dateCreated`
FROM `message_tbl`as m1
WHERE dateCreated = (SELECT MAX(m2.dateCreated)
from message_tbl as m2
WHERE (m1.user1Fk = m2.user1Fk
AND m1.user2Fk = m2.user2Fk
OR m1.user1Fk = m2.user2Fk
AND m1.user2Fk = m2.user1Fk
)
) AND ? IN (m1.user1Fk, m1.user2Fk)
ORDER BY dateCreated DESC
此查询大部分都有效,但缺少,我希望它检查,如果?
的给定ID与user1Fk
匹配,则应检查user1Delete
是否为0或1,如果它是1然后不显示消息user 1
删除它,与用户2相同,但我想不到逻辑,任何人都可以帮助我吗?
答案 0 :(得分:0)
我假设问号在那里,因为这是一个准备好的查询,问号应该用用户ID替换。
你的查询有点过于复杂,因为有很多子选择。我尝试改进它以获得更好的性能并且能够更容易地扩展它。使用SQL,您可以连接表而不是使用子查询,这样可以提高性能,并且可以更轻松地为连接表添加条件。
在下面的示例中,我为user1和user2删除字段添加了一个条件为0.我将限制设置为1,这意味着只返回第一行。与日期的降序一起,这意味着只返回最新的消息。我还将问号更改为:user_id ,因为在此示例中,它使用了两次,这样您只需添加一次。
SELECT
m.id,
u1.id AS sender_id,
CONCAT(u1.first_name, ' ', u1.last_name) AS senderName,
u2.id AS recipient_id,
CONCAT(u2.first_name, ' ', u2.last_name) AS recipientName,
u1.image AS senderImage,
u2.image AS recipientImage,
m.subject,
m.message,
m.user1Delete,
m.user2Delete,
m.dateCreated
FROM messages_tbl m
INNER JOIN user_tbl u1 ON m.user1Fk = u1.id
INNER JOIN user_tbl u2 ON m.user2Fk = u2.id
WHERE (m.user1Delete = 0 AND u1.id = :user_id)
OR (m.user2Delete = 0 AND u2.id = :user_id)
ORDER BY m.dateCreated DESC
LIMIT 1
我还没有能够测试它,但我希望这是你想要的。