如何正确过滤sqlite数据库中的数据?

时间:2019-07-19 09:08:32

标签: sql database sqlite

我有一个sqlite数据库,用于存储消息。它有4列,“消息”,“发送时间”,“写消息的人”和“得到消息的人”:

Message table

现在,我想过滤特定人的数据,以便他将最新消息发送给每个人。我的问题是,我只能以两种方式(获取和发送)获取最新消息。看起来是这样的:

Result

我使用的代码:

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设置它。

1 个答案:

答案 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,否则不可比较。