mysql - sql - 子查询中的关系未知

标签 mysql sql-server

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

相关文章:

sql-server - 根据行数之和检索特定行数

mysql - 通过内部连接或左/右连接替换与标量子查询的比较

php - 如何将 bcrypted 插入 mysql?

php - 如何让Mysql加载图片更快?

android - 如何在mysql中存储一个gps坐标,然后在没有时间延迟的情况下检索它?

sql-server - 不再需要在sql中使用 View 了吗?

sql-server - 删除值后如何重置 SQL Server 所有表的标识列?

c# - 分析MySQL数据库中的电话记录

sql - nodejs mssql - 传递的参数太多存储过程

c# - 如何在存储过程参数中传递多条记录?