【问题标题】:how to correctly filter data in a sqlite database?如何正确过滤sqlite数据库中的数据?
【发布时间】:2019-07-19 20:02:17
【问题描述】:

我有一个存储消息的 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') 是因为我实际上未能使用成本时间设置它。

【问题讨论】:

  • 在您的帖子中包含示例数据和所需结果作为 文本。最好作为前者的 CREATE TABLEINSERT 语句,以便于导入到测试数据库中。

标签: sql database sqlite


【解决方案1】:

如果你的 SQLite 版本支持CTEs,你可以这样做:

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的格式,否则不可比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2017-11-27
    • 2011-08-22
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多