SQLite:循环 SELECT 语句,替换 WHERE 子句

标签 sqlite loops

我有以下两个表:

CREATE TABLE messages (
  id integer UNIQUE NOT NULL,
  message text,
  recipient integer NOT NULL,
  sender integer NOT NULL,
  sent_at text NOT NULL,
  FOREIGN KEY (recipient) REFERENCES users (id),
  FOREIGN KEY (sender) REFERENCES users (id)
);
CREATE TABLE users (
  id integer UNIQUE NOT NULL,
  username text NOT NULL,
);

我需要一个非常具体的查询,如下所示:
SELECT *
FROM messages
WHERE sender = 123 OR recipient = 123
ORDER BY id desc
LIMIT 1

我需要遍历消息表,使用每个用户,并将他放在 WHERE 语句中。
-- TABLE 'users':
-- 123 = id of user1
-- 456 = id of user2
-- 789 = id of user3

是否可以在 SQLite 中进行迭代?

目标是,为用户表中的每个用户获取最新的“对话”。对于每个用户,无论该最新消息是由他发送还是接收,都应该显示涉及他的最新消息。

最佳答案

您可以使用相关子查询来获取每个用户 ID 的值:

SELECT id,
       username,
       (SELECT MAX(id)
        FROM messages
        WHERE sender    = users.id
           OR recipient = users.id
       ) AS last_message_id
FROM users

这也可以使用 GROUP BY。
首先将两个表连接在一起,然后为每个用户创建一个组:
SELECT users.id,
       MAX(messages.id)
FROM users
JOIN messages ON users.id = messages.sender OR
                 users.id = messages.recipient
GROUP BY users.id

关于SQLite:循环 SELECT 语句,替换 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483672/

相关文章:

python - sqlalchemy postgresql 其中 int = 字符串

database - 无论主键如何,如何检查两个关系数据库是否相同?

JavaScript - 石头剪刀布 - 用户输入不被确认

loops - 我想从一波中产生的不同敌人的数量中随机化产生的敌人的继承。 (TD游戏),我该怎么做?

"for"循环中的 Java 最佳实践。如何定义集合?

python - 如何将 sqlite 数据库添加到 Apache Superset?

SQLite 内连接 - 使用另一个表中的值更新

c++ - QSqlQuery 为列名 Sqlite 准备和绑定(bind)值

r - 降低绘图循环的速度以查看 R 中的移动(无需单击)

javascript - 将 jQuery 代码编写为循环结构