【问题标题】:Row Number with a mySQL Join带有 mySQL 连接的行号
【发布时间】:2014-04-02 11:14:51
【问题描述】:

我有以下正常工作的查询:

SELECT  @row_num :=  IF(@prev_value=concat(o.CITY, o.keyword_text)  ,@row_num+1, 1) AS     POSITION
   ,o.idBUSINESS
   ,o.KEYWORD_TEXT
   ,o.CITY
 , o.BID_AMOUNT
  ,@prev_value := concat(o.CITY, o.keyword_text) 
FROM   (SELECT @row_num := 1) x,
  (SELECT @prev_value := '') y,
  (SELECT @prev_value1 := '') z,
elevated_business_queue o
ORDER BY o.CITY , o.KEYWORD_TEXT, o.BID_AMOUNT DESC

此查询返回:

# POSITION, idBUSINESS, KEYWORD_TEXT, CITY, BID_AMOUNT, @prev_value := concat(o.CITY, o.keyword_text)
'1', '7', '2', 'New Jersey', '3.50', 'New Jersey2'
'2', '5', '2', 'New Jersey', '2.50', 'New Jersey2'
'3', '1', '2', 'New Jersey', '2.50', 'New Jersey2'
'1', '5', '1', 'New York', '2.50', 'New York1'
'2', '7', '1', 'New York', '2.30', 'New York1'
'3', '1', '1', 'New York', '1.50', 'New York1'
'1', '9', '2', 'New York', '7.50', 'New York2'
'2', '1', '2', 'New York', '4.50', 'New York2'
'3', '5', '2', 'New York', '3.50', 'New York2'
'4', '7', '2', 'New York', '2.50', 'New York2'

这个数据是正确的。现在,我想将提升的业务队列与另一个表连接起来。我这样做如下:

SELECT  @row_num :=  IF(@prev_value=concat(o.CITY, o.keyword_text)  ,@row_num+1, 1) AS POSITION
   ,o.idBUSINESS
   ,o.KEYWORD_TEXT
   ,o.CITY
 , o.BID_AMOUNT
   ,@prev_value := concat(o.CITY, o.keyword_text) 
    FROM   (SELECT @row_num := 1) x,
  (SELECT @prev_value := '') y,
  (SELECT @prev_value1 := '') z,
elevated_business_queue o
INNER JOIN funds_balance fb ON fb.idBUSINESS = o.idBUSINESS
 WHERE fb.PREMIUM_POSITIONS_CREDIT >= (o.BID_AMOUNT + ROUND((12.36/100)*o.BID_AMOUNT, 2))
ORDER BY o.CITY , o.KEYWORD_TEXT, o.BID_AMOUNT DESC

但是,当我加入时,我的 POSITION 会变得一团糟。我现在得到:

# POSITION, idBUSINESS, KEYWORD_TEXT, CITY, BID_AMOUNT, @prev_value := concat(o.CITY, o.keyword_text)
'2', '7', '2', 'New Jersey', '3.50', 'New Jersey2'
'1', '1', '2', 'New Jersey', '2.50', 'New Jersey2'
'1', '5', '2', 'New Jersey', '2.50', 'New Jersey2'
'2', '5', '1', 'New York', '2.50', 'New York1'
'3', '7', '1', 'New York', '2.30', 'New York1'
'1', '1', '1', 'New York', '1.50', 'New York1'
'1', '1', '2', 'New York', '4.50', 'New York2'
'2', '5', '2', 'New York', '3.50', 'New York2'
'1', '7', '2', 'New York', '2.50', 'New York2'

有人可以帮忙吗。

-------------更新----------

我尝试了以下查询,但 POSITION 仍然关闭:

SELECT T1.*,fb.* FROM
(SELECT  @row_num :=  IF(@prev_value=concat(o.CITY, o.keyword_text)  ,@row_num+1, 1) AS       POSITION
,o.idBUSINESS
,o.KEYWORD_TEXT
,o.CITY
,o.BID_AMOUNT
,@prev_value := concat(o.CITY, o.keyword_text) 
FROM   (SELECT @row_num := 1) x,
 (SELECT @prev_value := '') y,
 (SELECT @prev_value1 := '') z,
elevated_business_queue o
ORDER BY o.CITY , o.KEYWORD_TEXT, o.BID_AMOUNT DESC)T1
INNER JOIN funds_balance fb ON fb.idBUSINESS = T1.idBUSINESS
WHERE fb.PREMIUM_POSITIONS_CREDIT >= (T1.BID_AMOUNT + ROUND((12.36/100)*T1.BID_AMOUNT,    2))
ORDER BY T1.CITY ,T1.KEYWORD_TEXT, T1.BID_AMOUNT DESC;

我现在得到以下结果集:

# POSITION, idBUSINESS, KEYWORD_TEXT, CITY, BID_AMOUNT, @prev_value := concat(o.CITY, o.keyword_text), idBUSINESS, PREMIUM_POSITIONS_CREDIT
'1', '7', '2', 'New Jersey', '3.50', 'New Jersey2', '7', '17.30'
'3', '1', '2', 'New Jersey', '2.50', 'New Jersey2', '1', '12.31'
'2', '5', '2', 'New Jersey', '2.50', 'New Jersey2', '5', '15.19'
'1', '5', '1', 'New York', '2.50', 'New York1', '5', '15.19'
'2', '7', '1', 'New York', '2.30', 'New York1', '7', '17.30'
'3', '1', '1', 'New York', '1.50', 'New York1', '1', '12.31'
'2', '1', '2', 'New York', '4.50', 'New York2', '1', '12.31'
'3', '5', '2', 'New York', '3.50', 'New York2', '5', '15.19'
'4', '7', '2', 'New York', '2.50', 'New York2', '7', '17.30'

在纽约没有 KEYWORD_TEXT=2 的 POSITION=1。以下行的位置应为 1:

'2', '1', '2', 'New York', '4.50', 'New York2', '1', '12.31'

【问题讨论】:

  • 排名功能是我在任何一天都不信任的东西,我同意,从逻辑上讲它应该可以工作)。排序发生在初始行提取之后,到那时,基于变量的列可能已经设置好了。
  • 那么处理这种情况的正确方法是什么?有什么策略可以可靠地处理这个问题吗?

标签: mysql sql join


【解决方案1】:

在这里,您按列放错了顺序。如果您需要按 KEYWORD_TEXT 订购,则按 BID_AMOUNT 和 CITY(如果是,则)

更改顺序为:

 ORDER BY KEYWORD_TEXT, BID_AMOUNT  CITY 

【讨论】:

    【解决方案2】:

    也许你可以用这样的窗口函数替换你的 row_num 计算:

    row_number() over(partition by o.CITY , o.KEYWORD_TEXT order by o.BID_AMOUNT DESC)
    

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多