1

mikeキーワードの最高 3 つの入札単価に含まれていないかどうかを選択するクエリを実行しようとしています。行 4 と 7 を選択する必要があります。

最後に、mike がキーワードの上位 3 つの入札単価に含まれていない場合は、選択します。

これを解決するにはどうすればよいですか?サブクエリで?

$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

あなたの構造はあまり有望に見えませんし、あなたのサンプルデータもそうではありません。ただし、「マイク」がキーワードごとに上位3位に入っているかどうか、また、入札単価が3つあるかどうかを知りたいと思います。「1つ」は2つ、「2つ」は1つです。生データから、マイクは「1」キーワードで1位と4位、「2」キーワードで4位になっているようです。

これにより、すべてのキーワードの完全なクエリを実行しないという点で、必要なものが得られるはずです。最初の最も内側のクエリは、キーワードを「mike」(つまり「JustMike」)で入札することです。次に、それを一時広告に参加させます。これらのキーワードのみに広告を掲載します。

次に、MySQL変数を使用することで、キーワードごとのランクを追跡できます。秘訣は、ORDER BY句が、適切なランク付けを表す順序でそれらを返す必要があることです。この場合、各キーワードが最初に、次に各キーワード内で、最初に最高入札額の順に並べられます。

レコードをクエリし、@変数を使用して、カウンターを増やし、キーワードが変更されるたびに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
于 2012-06-07T18:33:17.690 に答える
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 に答える
-3

試す

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