Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:在SELECT语句上循环,替换WHERE子句_Sqlite_Loops - Fatal编程技术网

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;