我正在尝试执行一个选择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 |
答案 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