【问题标题】:MySQL subquery WHERE INMySQL 子查询 WHERE IN
【发布时间】:2015-09-17 19:57:56
【问题描述】:

我在下面有这个查询并运行它,但它一直说我有不同版本的MySQL? 我认为问题在于 WHERE IN 及其子查询。

谁能帮帮我?

SELECT Field2, Field3, Count(Distinct Field1)
FROM learning.master
WHERE Field3 IN 
(SELECT Field3, COUNT(Distinct Field1)
FROM learning.master_06302015
WHERE (Field2 IS NOT NULL AND Field3 IS NOT NULL AND Field7 IS NOT NULL)
GROUP BY Field3
ORDER BY COUNT(Distinct Field1)
LIMIT 10)
Group BY Field2, Field3;

【问题讨论】:

  • 是的,子查询有问题。子查询应该返回一个 single 表达式(列)。
  • 如果主查询和子查询使用相同的表怎么办?
  • SELECT Field2, Field3, Count(Distinct Field1) FROM learning.master_06302015 WHERE Field3 IN (SELECT Field3 FROM learning.master_06302015 WHERE (Field2 IS NOT NULL AND Field3 IS NOT NULL AND Field7 IS NOT NULL) 组BY Field3 ORDER BY COUNT(Distinct Field1) DESC LIMIT 10;) Group BY Field2, Field3 ;
  • 用表别名限定所有列引用。 SELECT t.Field1 FROM mytable t。只需为每个引用使用不同的别名。请参阅我的答案中的示例。

标签: mysql subquery where-clause where-in


【解决方案1】:

编辑

当子查询涉及 LIMIT 时,使用连接操作而不是 WHERE IN。

(编辑删除了原始答案的第一部分。感谢 Gordon 指出这一点。)

只需从子查询的 SELECT 列表中删除此表达式 , COUNT(Distinct Field1)。


像这样:

 SELECT t.Field2
      , t.Field3
      , COUNT(DISTINCT t.Field1) 
   FROM learning.master t
  WHERE Field3 IN ( SELECT o.Field3
                      FROM learning.master_06302015 o
                     WHERE o.Field2 IS NOT NULL 
                       AND o.Field3 IS NOT NULL
                       AND o.Field7 IS NOT NULL
                     GROUP BY o.Field3
                     ORDER BY COUNT(DISTINCT o.Field1) 
                     LIMIT 10
                  )
  GROUP BY t.Field2, t.Field3

或者,使用连接操作,如下所示:

 SELECT t.Field2
      , t.Field3
      , COUNT(DISTINCT t.Field1) 
   FROM learning.master t
   JOIN ( SELECT o.Field3
            FROM learning.master_06302015 o
           WHERE o.Field2 IS NOT NULL 
             AND o.Field3 IS NOT NULL
             AND o.Field7 IS NOT NULL
           GROUP BY o.Field3
           ORDER BY COUNT(DISTINCT o.Field1) 
           LIMIT 10
        ) p
     ON p.Field3 = t.field3   
  GROUP BY t.Field2, t.Field3

【讨论】:

  • 我不认为第一个在 MySQL 中有效(在某些子查询中不允许 LIMIT)。不过,第二个应该没问题。
  • @GordonLinoff:你是对的。 MySQL 返回错误代码:1235“此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANYSOME 子查询'”。我的答案经过编辑以删除 SQL 的第一个建议。请改用 JOIN 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多