首页 文章

MySQL连接查询或子查询

提问于
浏览
1

我正在尝试执行一个选择 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
    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
            )
    
  • -3

    您的结构看起来不太有希望,也不是您的样本数据 . 然而,那就是说,你想知道“迈克”是否在每个关键词的前三位......并且他有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
    
  • 1

    试试这个:

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

    尝试

    SELECT .. ORDER BY bid LIMIT 3,999
    

相关问题