SQLite子查询:“IN”外部查询的结果
我有两张桌子。我想获得每个user.name的重复对a、b的数量 使用者 配对 在上述示例中,结果应为:SQLite子查询:“IN”外部查询的结果,sqlite,subquery,Sqlite,Subquery,我有两张桌子。我想获得每个user.name的重复对a、b的数量 使用者 配对 在上述示例中,结果应为: name | id | c ------------------- "Alice" | 0,2 | 1 "Bob" | 1 | 0 当每个用户只有一个id时,我可以这样做: SELECT name, id, ( SELECT COUNT(*) FROM pair JOIN pair AS p USING (id, a, b) WHERE id = us
name | id | c
-------------------
"Alice" | 0,2 | 1
"Bob" | 1 | 0
当每个用户只有一个id时,我可以这样做:
SELECT name, id, (
SELECT COUNT(*) FROM pair JOIN pair AS p USING (id, a, b)
WHERE id = user.id AND pair.rowid < p.rowid
) AS c FROM user;
我想知道有没有一种简单有效的方法,比如在中将WHERE子句从pair.id=user.id改为pair.id
如果数据库能够按顺序遍历行,而不必对表进行排序,则可以加快按名称分组操作。
这可以通过名称列上的索引来完成,而另一列则使其成为一个索引,这只会有一点帮助:
CREATE INDEX user_name_id_index ON user(name, id);
查询通过id、a和b值查找对行;可以使用以下列上的索引加快这些查找:
CREATE INDEX pair_id_a_b_index ON pair(id, a, b);
要帮助查询优化器在选择索引时做出更好的决策,请运行
查询优化器不断改进;如果可能的话,请联系我们
要检查查询是如何执行的,请查看命令的输出。您有索引吗?@CL.No。如果我有索引,这会更容易吗?这意味着我可以通过在表上创建索引来加快原始查询的速度。但是在子查询中是否有类似pair.id的内容?或者我就是做不到?有点像pair.id在哪里;在您的查询中,user.id列表被称为t。否,我的意思是,我可以像在单个id的情况下那样,直接使用WHERE id=user.id从外部查询使用,而不必将其作为表t重新查询吗?
SELECT name, GROUP_CONCAT(id), (
WITH t AS (SELECT id FROM user AS u WHERE name = user.name)
SELECT COUNT(*) FROM pair JOIN pair AS p USING (a, b)
WHERE pair.id IN t AND p.id IN t AND pair.rowid < p.rowid
) AS c FROM user GROUP BY name;
/* This will not work! "Error: no such table: user.id" */
SELECT name, GROUP_CONCAT(id), (
SELECT COUNT(*) FROM pair JOIN pair AS p USING (a, b)
WHERE pair.id IN user.id AND p.id IN user.id AND pair.rowid < p.rowid
) AS c FROM user GROUP BY name;
CREATE INDEX user_name_id_index ON user(name, id);
CREATE INDEX pair_id_a_b_index ON pair(id, a, b);