Mysql 子查询中的sql关系未知

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

我有一个由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     |    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 |