【发布时间】:2018-04-20 12:50:24
【问题描述】:
我有一个用户表和一个消息表。
在消息表(名为messaggi)中有msg_to 和msg_from,它们的消息(msg_text)和msg_date(这是一个日期和时间)。
我正在努力实现以下目标:
utenti表中的所有用户对于发送或接收消息的每个用户,应显示最后一个消息
向非自己的人隐藏消息(在本例中 id_utente 1 = self)。
这是我想出的,但我不断收到所有消息或双重用户,等等......
SELECT CONCAT(LEFT(u.fname, 1), LEFT(u.lname, 1)) AS iniziali,
u.email,
u.color,
CONCAT(u.fname, " ", u.lname) AS full_name,
MAX(m.msg_date) AS msg_date,
m.msg_text
FROM utenti u
INNER JOIN messaggi m ON m.msg_to = u.id_utente
WHERE m.msg_to = 1
GROUP BY m.msg_to,
m.msg_from
UNION
SELECT CONCAT(LEFT(u2.fname, 1), LEFT(u2.lname, 1)) AS iniziali,
u2.email,
u2.color,
CONCAT(u2.fname, " ", u2.lname) AS full_name,
"",
""
FROM utenti u2
WHERE u2.id_utente NOT IN
(
SELECT id_utente
FROM utenti u
INNER JOIN messaggi m ON m.msg_to = u.id_utente
WHERE m.msg_to = 1
AND u.id_utente = 1
GROUP BY m.msg_to,
m.msg_from
);
这是一个小提琴:
http://sqlfiddle.com/#!9/106319/1
我想要的输出应该是:
| iniziali | email | color | full_name | msg_date | msg_text |
|----------|-------------|--------|--------------|---------------------|----------------|
| BV | 456@me.com | (null) | Bill Villa | 2018-04-20 12:29:20 | Msg 2 (1 to 2) |
| MG | 789@me.com | (null) | Max Gazze | 2018-04-09 14:59:39 | Msg 1 (3 to 1) |
| JB | 101@me.com | (null) | Jack Blue | | |
在这种情况下,我是 id#1,我只能看到从我发送的消息和发送给我的消息,对于每个用户,我只能看到最后一个接收或发送的消息。像 WhatsApp、Facebook Messanger、Telegram 等...您会看到每个联系人的联系人和发送/接收的最后一条消息。
不显示与其他用户(即:用户 2 到用户 3)之间的消息。
如您所见,我在用户列表中看不到自己 (id#1),对于 Jack Blue,我只看到他的名字,没有消息,因为用户 1 和 4 从未发送过任何消息。所以我最终得到一个用户列表,对于每个用户,我都会看到最新的消息(发送或接收),而没有消息的地方,我只看到带有空 msg_text 和 msg_date 的用户
【问题讨论】:
-
您能否详细说明第 3 点?听起来您想从自己那里获取最近收到的消息?也许你可以给出你的小提琴的预期输出?
-
@PerlPingu 好的,我确实添加了一些数据。 Tku
-
@PerlPingu 我还编辑了小提琴并添加了更多关于没有消息的用户的详细信息。
-
啊,我想我在最后一次编辑关于没有消息的用户之前已经完成了
标签: mysql greatest-n-per-group