了解此查询(COUNT&子查询)

时间:2012-06-08 14:08:14

标签: mysql sql

我无法理解此查询:

SELECT * 
  FROM `advertise` parent 
 WHERE 3  <= ( SELECT COUNT(username) 
                 FROM `advertise` 
                WHERE keyword = parent.keyword 
                  AND bid > parent.bid) 
   AND username = 'mike'

此查询的作用是显示用户名为'mike'的所有行;如果该行不在关键字的三个最高出价中。

以下是sqlfiddle that works,但我不明白它是如何运作的。更具体地说,我不了解3 <=这个特定的查询。

3 <=如何确定该行不在关键字的三个最高出价中?

2 个答案:

答案 0 :(得分:2)

此查询的工作原理如下:

子查询

SELECT COUNT(username) FROM `advertise` WHERE keyword = parent.keyword AND bid > parent.bid

查找对同一关键字具有更高出价的行数。然后,我们会指定我们要查找的出价不能出现在前三个出价中,因此我们要求该查询至少返回3个出价。以下是我认为您的最终查询应如下所示:

SELECT * FROM `advertise` parent 
WHERE 3  <= ( SELECT COUNT(username) 
    FROM `advertise` 
    WHERE keyword = parent.keyword 
    AND bid > parent.bid) 
AND username = 'mike'

答案 1 :(得分:1)

如果稍微重新格式化,可以使它更简单:

SELECT * FROM `advertise` parent 

WHERE (SELECT COUNT(username) 
   FROM `advertise` 
   WHERE keyword=parent.keyword 
   AND bid>parent.bid) >= 3 

AND username='mike'

对从父查询返回的每一行评估子查询,因此它将为每一行执行X >= 3