1

我正在尝试进行查询,以选择mike它是否不在关键字的三个最高出价中。应选择第 4 行和第 7 行。

因此,最后,如果 mike 不在关键字的三个最高出价中,则选择。

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

$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

4 回答 4

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
        )
于 2012-06-07T18:04:08.923 回答
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)
于 2012-06-07T18:31:39.253 回答
0

您的结构看起来不太有希望,您的示例数据也没有。但是,也就是说,您想知道“Mike”是否在每个关键字的前 3 名中......并且他有 3 个出价......“一”为 2,“二”为 1。从原始数据来看,Mike 的“一”关键字排名第一和第四,“二”关键字排名第四。

这应该可以让您在某些方面获得您需要的东西,而不是对所有关键字进行完整查询。第一个最里面的查询是通过“mike”(因此别名“JustMike”)获得关键字出价。然后将其加入到只有那些关键字的临时广告中。

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

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

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
于 2012-06-07T18:33:17.690 回答
-3

尝试

SELECT .. ORDER BY bid LIMIT 3,999
于 2012-06-07T17:57:59.907 回答