SQLite:在SELECT语句上循环,替换WHERE子句
我有以下两个表格:SQLite:在SELECT语句上循环,替换WHERE子句,sqlite,loops,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
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
我需要遍历messages表,使用每个用户,并将其放入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
这也可以通过分组方式实现。
首先将两个表连接在一起,然后为每个用户创建一个组:
SELECT users.id,
MAX(messages.id)
FROM users
JOIN messages ON users.id = messages.sender OR
users.id = messages.recipient
GROUP BY users.id
你对GROUPBY子句了解多少?我知道它存在。我无法想象这会有什么帮助。然而,我把你的问题当作一个提示,并将尝试以某种方式使用它。:)可能的重复,“迭代”是一个编程概念。要处理RDB,我们应该从关系的角度考虑:连接关系以创建新的关系,过滤和分组以获得相关行。这些解决方案不仅完美,尤其是第一个解决方案是纯粹的优雅。我的想法太复杂了。荣誉这假设消息ID随着时间的推移而严格增加(考虑到提供的模式细节,这是一个非常合理的消息ID)。虽然此代码片段可以解决这个问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。
SELECT year , COUNT(*) AS Count
FROM Movie
WHERE Movie.MID NOT IN
(SELECT DISTINCT m.MID
FROM Movie m
JOIN M_Cast m_c ON m.MID = m_c.MID
JOIN Person p_1 ON m_c.PID = p_1.PID
AND p_1.Gender='Male')
AND Movie.MID IN
(SELECT DISTINCT m.MID
FROM Movie m
JOIN M_Cast m_c ON m.MID = m_c.MID
JOIN Person p_1 ON m_c.PID = p_1.PID
AND p_1.Gender='Female')
GROUP BY year;