我有一个sqlite数据库,用于存储消息。它有4列,“消息”,“发送时间”,“写消息的人”和“得到消息的人”:
现在,我想过滤特定人的数据,以便他将最新消息发送给每个人。我的问题是,我只能以两种方式(获取和发送)获取最新消息。看起来是这样的:
我使用的代码:
SELECT Accounts_2.Benutzername as Sender, Accounts.Benutzername as Empfaenger, Nachrichten.Inhalt, Nachrichten.Zeit
FROM Nachrichten
LEFT JOIN Accounts ON Nachrichten.Empfaenger = Accounts.ID
LEFT JOIN Accounts as Accounts_2 On Nachrichten.Sender = Accounts_2.ID
WHERE (Accounts_2.Benutzername = 'gondolator' OR Accounts.Benutzername = 'gondolator')
group by Accounts.Benutzername, Accounts_2.Benutzername;
我加入帐户数据库以获取用户名。
我现在只想要发送或接收的最后一条消息。两者都不是。
有人可以帮助我提供正确的SQL语句吗?
编辑: 重建表的代码:
CREATE Table Accounts(
ID INTEGER Primary KEY,
Benutzername TEXT NOT NULL UNIQUE);
Create Table Nachrichten(
Sender INTEGER NOT NULL,
Empfaenger INTEGER NOT NULL,
Zeit date NOT NULL,
Inhalt TEXT NOT NULL,
FOREIGN KEY(Sender) REFERENCES Accounts(ID),
FOREIGN KEY(Empfaenger) REFERENCES Accounts(ID));
INSERT INTO Accounts(Benutzername) Values('gondolator');
INSERT INTO Accounts(Benutzername) Values('Killergondel');
INSERT INTO Accounts(Benutzername) Values('Jan');
INSERT INTO Accounts(Benutzername) Values('TestUser');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(1, 2,
datetime('now'), 'test test');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(1, 3,
datetime('now'), 'huhu');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(1, 4,
datetime('now'), 'verdammt?');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(2, 1,
datetime('now'), 'TEST');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(3, 1,
datetime('now'), 'TEST');
INSERT INTO Nachrichten(Sender, Empfaenger, Zeit, Inhalt) Values(4, 1,
datetime('now'), 'HI');
我使用了datetime('now'),因为我实际上没有用costum time设置它。
答案 0 :(得分:0)
如果您的 SQLite 版本支持CTE
,则可以这样操作:
WITH
cte AS (
SELECT
s.Benutzername as Sender,
r.Benutzername as Empfaenger,
n.Inhalt,
n.Zeit
FROM Nachrichten n
LEFT JOIN Accounts r ON n.Empfaenger = r.ID
LEFT JOIN Accounts s ON n.Sender = s.ID
WHERE 'gondolator' IN (s.Benutzername, r.Benutzername)
),
lastdates as (
SELECT
CASE
WHEN 'gondolator' = c.Empfaenger THEN c.Sender
WHEN 'gondolator' = c.Sender THEN c.Empfaenger
END other,
MAX(c.Zeit) maxdate
FROM cte c
GROUP BY other
)
SELECT c.*
FROM cte c inner join lastdates l
ON l.other in (c.Empfaenger, c.Sender) AND l.maxdate = c.Zeit
请参见demo。
结果:
| Sender | Empfaenger | Inhalt | Zeit |
| ------------ | ---------- | --------- | ------------------- |
| gondolator | Jan | huhu | 2019-07-17 15:40:53 |
| gondolator | TestUser | verdammt? | 2019-07-17 15:41:36 |
| Killergondel | gondolator | TEST | 2019-07-17 15:22:58 |
请注意,日期列Zeit
的格式必须为:YYYY-MM-DD HH:mm:ss
,否则不可比较。