【问题标题】:Two conditions for query in MySQL with EXISTS在 MySQL 中使用 EXISTS 进行查询的两个条件
【发布时间】:2016-10-02 19:56:21
【问题描述】:

我正在尝试获得满足 EXISTS 条件的两个条件的作者。但是,当子查询实际工作时,我会不断获取作者表中的所有条目。 谁能告诉我我的查询到底有什么问题?我目前正在统计条目的数量。

SELECT COUNT(*) 
FROM author
WHERE 
EXISTS (SELECT A.author_id, A.author_name
FROM author AS A 
INNER JOIN author_publication AS AP ON A.author_id = AP.author_id
INNER JOIN publication AS P ON AP.pub_id = P.pub_id
WHERE P.pub_key LIKE '%/pvldb/%'
GROUP BY A.author_id
HAVING COUNT(*)>=10)
AND
EXISTS (SELECT A.author_id, A.author_name
FROM author AS A 
INNER JOIN author_publication AS AP ON A.author_id = AP.author_id
INNER JOIN publication AS P ON AP.pub_id = P.pub_id
WHERE P.pub_key LIKE '%/sigmod/%'
GROUP BY A.author_id
HAVING COUNT(*)>=10)
;

【问题讨论】:

    标签: mysql exists


    【解决方案1】:

    您的子查询与您的主查询没有任何关系。因此,对于每条记录,您都会问同样的问题:“表中是否存在至少有十篇特定类型出版物的作者?”。每条记录的答案都是相同的,因此您可以取回所有记录。您真正想问的是:“表中是否存在至少十篇特定类型的出版物此作者?”

    SELECT COUNT(*) 
    FROM author
    WHERE EXISTS 
    (
      SELECT 1
      FROM author_publication AS AP 
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE AP.author_id = author.author_id
      AND P.pub_key LIKE '%/pvldb/%'
      GROUP BY AP.author_id
      HAVING COUNT(*) >= 10
    ) 
    AND EXISTS 
    (
      SELECT 1
      FROM author_publication AS AP 
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE AP.author_id = author.author_id
      AND P.pub_key LIKE '%/sigmod/%'
      GROUP BY AP.author_id
      HAVING COUNT(*) >= 10
    );
    

    如果要编写不相关的子查询,请改用IN

    SELECT COUNT(*) 
    FROM author
    WHERE author_id IN 
    (
      SELECT AP.author_id
      FROM author_publication AS AP 
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE P.pub_key LIKE '%/pvldb/%'
      GROUP BY AP.author_id
      HAVING COUNT(*) >= 10
    ) 
    AND author_id IN 
    (
      SELECT AP.author_id
      FROM author_publication AS AP 
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE P.pub_key LIKE '%/sigmod/%'
      GROUP BY A.author_id
      HAVING COUNT(*) >= 10
    );
    

    下面是如何使用单个子查询来做到这一点:

    SELECT COUNT(*) 
    FROM
    (
      SELECT AP.author_id
      FROM author_publication AS AP 
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE P.pub_key LIKE '%/pvldb/%' OR P.pub_key LIKE '%/sigmod/%'
      GROUP BY AP.author_id
      HAVING COUNT(CASE WHEN P.pub_key LIKE '%/pvldb/%' THEN 1 END) >= 10
         AND COUNT(CASE WHEN P.pub_key LIKE '%/sigmod/%' THEN 1 END) >= 10
    ) found_authors;
    

    【讨论】:

    • 感谢您的解释!这对我来说真的很清楚。
    【解决方案2】:

    试试:

    SELECT COUNT(A.author_id)
    FROM
      author AS A
        INNER JOIN author_publication AS AP ON A.author_id = AP.author_id
        INNER JOIN publication AS P ON AP.pub_id = P.pub_id
    WHERE
      P.pub_key LIKE '%/pvldb/%' OR P.pub_key LIKE '%/sigmod/%'
    GROUP BY A.author_id
    HAVING COUNT(A.author_id) >= 10;
    

    【讨论】:

      【解决方案3】:

      您只需要将子查询关联到主查询:

      SELECT COUNT(*) 
      FROM author as AA
      WHERE 
      EXISTS (SELECT A.author_id, A.author_name
      FROM author AS A 
      INNER JOIN author_publication AS AP ON A.author_id = AP.author_id
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE P.pub_key LIKE '%/pvldb/%'
      AND AA.author_id=A.author_id
      GROUP BY A.author_id
      HAVING COUNT(*)>=10)
      AND
      EXISTS (SELECT A.author_id, A.author_name
      FROM author AS A 
      INNER JOIN author_publication AS AP ON A.author_id = AP.author_id
      INNER JOIN publication AS P ON AP.pub_id = P.pub_id
      WHERE P.pub_key LIKE '%/sigmod/%'
      AND AA.author_id=A.author_id
      GROUP BY A.author_id
      HAVING COUNT(*)>=10)
      ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 2014-09-17
        相关资源
        最近更新 更多