Mysql 子查询中的sql关系未知
我有一个由2个整数photo_id,user_id和一个字符串-info建立的关系,这是标签, 主键是用户id、照片id、信息Mysql 子查询中的sql关系未知,mysql,sql-server,Mysql,Sql Server,我有一个由2个整数photo_id,user_id和一个字符串-info建立的关系,这是标签, 主键是用户id、照片id、信息 photo_id | user_id | info --------------------------- 5 | 3 | aa 7 | 6 | aa 2 | 2 | bb 1 | 2 | cc 1 | 9 | aa 2
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错误:
错误:关系t不存在
我的错在哪里 这可能只是你解决问题的一步,因为我不完全理解这个问题。我认为您需要先对distinct列进行计数,然后使用更简单的where子句 MySQL 5.6架构设置: 问题1: :
虽然我仍然不清楚您想要实现什么,并且假设查询是针对MySQL而不是sql server的,那么下面的内容也可能会有所帮助。请注意,错误消息的原因是别名T引用了一个resultset,但您不能在where子句中重用整个resultset。子查询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
;
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
;
现在,我还不清楚您是如何得出问题中所示的预期结果的,其中不包括标记bb
顺便说一下。原始查询中的另一个问题是where子句谓词将整数与“k”进行比较
其中选择countinfo….<'k'
countinfo是一个整数,“k”是一个字符串,因此它将失败。尝试将“SELECT countinfo FROM T T1”更改为“SELECT countinfo tagCount FROM T T1”,这可能有助于发布带有一些示例数据的表结构……我已经尝试过这一点,但现在错误是:关系T1不存在。。我已经添加了关于表的更多信息:顺便说一下,子查询T中的ORDERBY子句是无点的。请参阅:错误消息。别名t引用整个子查询,不能在where子句内将该子查询重新用于另一个子查询。除非您使用MySQL中不可用的公共表表达式或将子查询持久化到表中。您使用的是MySQL还是Sql Server?它们是非常不同的数据库引擎,但问题有两个标签。如果您想避免在这里出现否决票,您应该只针对您正在使用的数据库类型标记问题。
| info | photoCount | userCount |
|------|------------|-----------|
| cc | 3 | 4 |
| aa | 3 | 3 |
| bb | 1 | 1 |
/* 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
;
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 |