【发布时间】:2023-03-24 16:13:01
【问题描述】:
我有两张桌子user 和pair。我想为每个user.name 获取重复对的数量(a, b)。
用户
name | id
-------------
"Alice" | 0
"Bob" | 1
"Alice" | 2
配对
id | a | b
-----------
0 | 0 | 1
0 | 1 | 3
1 | 0 | 1
2 | 1 | 3
在上面的例子中,结果应该是:
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;
当有多个ids时,我可以从下面的查询中得到正确的结果,但是当有更多的行和更多的子查询时会很慢。
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;
我想知道有没有一种简单有效的方法,比如将WHERE子句从pair.id = user.id更改为pair.id IN <<the user.id list>>?
/* 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;
【问题讨论】:
-
你有索引吗?
-
@CL。不会。如果我有索引会更容易吗?