SELECT
@rownum1,
@rownum1 := @rownum1 + 1 AS r_n,
a.trade_date as date_a,
ab.trade_date as date_ab
FROM
stock_daily_data a,
(SELECT @rownum1 := 0) r,
(
SELECT
*
FROM
stock_daily_data
WHERE
stock_code = '300517.SZ'
AND trade_date BETWEEN '2018-05-18'
AND '2018-05-18'
) ab
WHERE
a.stock_code = '300519.SZ'
AND a.trade_date < ab.trade_date
AND a.trade_date BETWEEN '2018-05-10'
AND '2018-05-14'
ORDER BY
ab.trade_date DESC, a.trade_date DESC
結果:

上面的r_n可以按從大到小來升序
但是如果FROM里面的子查詢ab里面的trade_date取值范圍是多于一天的話,例如是BETWEEN '2018-05-17' AND '2018-05-18' ,那么結果會變成是

上面的r_n只能從小到大來升序
請問各位大佬,為什么會有這樣的問題?謝謝指點!
uj5u.com熱心網友回復:
1, 首先這兩個陳述句結果都是正確的, 排序只保證 order by 后面 的欄位2,至于會出現r_n不一致, 是因為兩者執行的優化策略不一樣,前者是按order by后面順序取值, 后者是取值后再進行排序,MYSQL會認為在第二種情況下用這種方法更快, 你可以前面加explain來驗證。隨著優化策略不一樣,將來還有可能出現第N種@runnum排法, 所以用你@rownum方法來作記錄順序值是不可靠的。
uj5u.com熱心網友回復:
感謝指點。
我按您說的加了EXPLAIN來測驗,結果如下:
取值范圍是單天的

取值范圍是兩天的

的確是有所不同,不過我看不懂這個?
另外,如果說用@rownum來記錄順序值不可靠,那么應該用什么來記錄會可靠呢?求進一步指導,謝謝!
uj5u.com熱心網友回復:
把rownum 取出來, 再包裹一層SELECT @rownum1, @rownum1 := @rownum1 + 1 AS r_n, TMP.* FROM ( SELECT .. FROM .. WHERE .. ORDER BY..) as tmp
uj5u.com熱心網友回復:
你是笛卡爾連接的轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/45035.html
標籤:MySQL
上一篇:哪個大神幫忙解決一下
