我有一个由 2 个整数 photo_id 、 user_id 和一个字符串信息构建的关系,(这是标签), 主键是 (user_id, photo_id, info)
photo_id | user_id | info
---------------------------
5 | 3 | aa
7 | 6 | aa
2 | 2 | bb
1 | 2 | cc
1 | 9 | aa
2 | 8 | cc
1 | 4 | cc
9 | 9 | cc
我试图在我的关系中找到 k 个最常见的标签。 (二次排序是按标签)。 在这个例子中我想得到:
k=2 : aa , cc
k=1 : cc
通过使用这个 sql 查询:
SELECT info,tagCount
FROM (SELECT info, COUNT(photo_id) as tagCount
FROM Tags
GROUP BY info
ORDER BY tagCount DESC, info ASC) T
WHERE (SELECT count(info) FROM T T1
WHERE ((T1.tagCount > T.tagCount) OR
(T1.tagCount = T.tagCount AND T1.info < T.info))) < 'k';
但是我得到了错误:
SQL error:
ERROR: relation "t" does not exist
我的错误在哪里?
最佳答案
虽然我仍然不清楚您要实现的目标,并且假设查询是针对 MySQL(而不是“sql server”),那么以下内容也可能有所帮助。请注意,错误消息的原因是别名 T 引用了一个结果集,但您不能在 where 子句中重用整个结果集(子查询 T1 假定您可以重用 T)。遗憾的是 MySQL(在撰写本文时)不支持允许像这样引用 T 的公用表表达式:
/* T as a common table expression (CTE) */
with T as (
SELECT info, COUNT(photo_id) as tagCount
FROM Tags
GROUP BY info
)
SELECT info,tagCount
, (SELECT count(info) FROM T T1
WHERE (T1.tagCount > T.tagCount) OR
(T1.tagCount = T.tagCount AND T1.info < T.info)
) as k
FROM T
ORDER BY tagCount DESC, info ASC
;
因此,在没有 CTE 功能的情况下,您必须重复初始子查询,如下所示:
SELECT
info
, tagCount
, (
SELECT
COUNT(info)
FROM (
SELECT
info
, COUNT(photo_id) AS tagCount
FROM Tags
GROUP BY
info
) T1
WHERE (T1.tagCount > T.tagCount)
OR (T1.tagCount = T.tagCount
AND T1.info < T.info)
)
AS k
FROM (
SELECT
info
, COUNT(photo_id) AS tagCount
FROM Tags
GROUP BY
info
) T
ORDER BY
tagCount DESC
, info ASC
;
该查询的结果(来自样本数据)如下:
| info | tagCount | k |
|------|----------|---|
| cc | 4 | 0 |
| aa | 3 | 1 |
| bb | 1 | 2 |
现在,我仍然不清楚您究竟如何得出问题中显示的“预期结果”(其中不包括标签“bb”)。
顺便说一句。原始查询中的另一个问题是 where 子句谓词将整数与“k”进行比较
- where (select count(info) ....) <'k'
count(info) 是一个整数,'k' 是一个字符串,所以它会失败。
关于mysql - sql - 子查询中的关系未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376602/