MySQL连接查询或子查询

时间:2012-06-07 17:38:36

标签: mysql

我正在尝试执行一个选择mike的查询,如果它不在关键字的三个最高出价中。应选择第4行和第7行。

所以在最后,如果迈克不是关键字的三个最高出价,那么选择。

我该如何解决这个问题?使用子查询?

$construct = "SELECT child.* FROM `temp-advertise` child
    LEFT JOIN `temp-advertise` parent on child.keyword=parent.keyword
    WHERE child.name='mike'
    ORDER BY child.id DESC";

 id  |  name| keyword    | bid   |
   1 |  mike|  one       |  7    |
   2 |  tom |  one       |  4    |
   3 |  ced |  one       |  6    |
   4 |  mike|  two       |  1    |
   5 |  tom |  two       |  5    |
   6 |  har |  two       |  5    |
   7 |  mike|  one       |  3    |
   8 |  har |  two       |  3    |

4 个答案:

答案 0 :(得分:1)

SELECT  *
FROM    `temp-advertise` ta
WHERE   ta.keyword = 'one'
        AND ta.name = 'mike'
        AND ta.bid <
        (
        SELECT  bid
        FROM    `temp-advertise` tai
        WHERE   tai.keyword = 'one'
        ORDER BY
                bid DESC
        LIMIT 2, 1
        )

答案 1 :(得分:0)

试试这个:

Select ID, name, keyword from temp-advertise e
    where 3 <= (select count(name) from temp-advertise
        where e.keyword = keyword and bid > e.bid)

答案 2 :(得分:0)

您的结构看起来不太有希望,也不是您的样本数据。然而,那就是说,你想知道“迈克”是否在每个关键词的前三位......并且他有3个出价...... 2个用于“一个”,1个用于“两个”。从原始数据看,迈克在“一个”关键字中位居第一,第四位,“两个”关键字位居第四位。

如果不对所有关键字进行完整查询,这应该可以满足您的需求。第一个最里面的查询是通过“mike”获取关键字出价(因此别名为“JustMike”)。然后将其加入到ONLY THOSE关键字的临时广告中。

接下来,通过使用MySQL变量,我们可以跟踪PER KEYWORD的等级。诀窍是ORDER BY子句需要以表示正确排名的顺序返回它们。在这种情况下,首先是每个关键字,然后是每个关键字,首先按最高出价排序。

通过查询记录,然后使用@variables,我们增加计数器,每次关键字更改时从1开始,然后将关键字保存到@grpKeyword变量中以比较下一条记录。一旦针对相应的关键字处理了所有出价,它就会查询该结果,但仅针对“迈克”的出价。这些记录将具有他的等级位置。

select RankPerKeyword.*
   from
      ( SELECT ta.*,
               @grpCnt := if( @grpKeyword = ta.Keyword, @grpCnt +1, 1 ) as KWRank,
               @grpKeyword := ta.Keyword as carryForward
           FROM 
              ( select distinct ta1.keyword
                   from `temp-advertise` ta1
                   where ta1.name = "mike" ) as JustMike
                 JOIN `temp-advertise` ta
                    on JustMike.Keyword = ta.Keyword,
              ( select @grpCnt := 0,
                       @grpKeyword := '' ) SqlVars
           ORDER BY 
              ta.Keyword,
              ta.Bid DESC" ) RankPerKeyword
   where
     RankPerKeyword.name = "mike" 

(上面运行只是预览结果......应显示3条记录)

所以,如果你想知道它是否在关键字的前3位,你可以改为

select RankPerKeyword.keyword, MIN( RankPerKeyword.KWRank ) as BestRank
  from (rest of query)
  group by RankPerKeyword.Keyword

答案 3 :(得分:-3)

尝试

SELECT .. ORDER BY bid LIMIT 3,999