在MySQL中,使用@vars

时间:2017-10-23 15:18:34

标签: mysql create-table create-view

我认为使用视图或表格或临时表会给我相同的结果。

我正在创建一些输出,用于另一个适用于CREATE TABLECREATE TEMPORARY TABLE的语句,但不适用于CREATE VIEW

我正在创建的输出使用3个连接表中的字段。有趣的部分是我在输出中使用IFs@vars生成的新字段,以在组中添加序数。以下是序数字段输出的一些示例数据:

display_name  date_played  end_hcp
Alan          2017-08-23   720
Alan          2017-08-29   692
Alan          2017-09-26   694
Bill          2017-08-24   865
Bill          2017-09-02   868
Bill          2017-09-21   842 
Dave          2017-08-24   363
Dave          2017-08-31   339
Dave          2017-09-05   332
Dave          2017-09-15   348
Dave          2017-09-17   374

这就是我希望它添加在新的Ordinal列中的样子:

display_name  date_played  end_hcp  Ordinal
Alan          2017-08-23   720      1
Alan          2017-08-29   692      2
Alan          2017-09-26   694      3
Bill          2017-08-24   865      1
Bill          2017-09-02   868      2
Bill          2017-09-21   842      3
Dave          2017-08-24   363      1
Dave          2017-08-31   339      2
Dave          2017-09-05   332      3
Dave          2017-09-15   348      4
Dave          2017-09-17   374      5

以下是使用CREATE TEMPORARY TABLE的工作代码:

DROP TEMPORARY TABLE IF EXISTS pre_ordinal;
CREATE TEMPORARY TABLE pre_ordinal AS 
SELECT u.display_name,
       m.date_played,
       p.end_hcp
FROM `lwljhb_lwl_matches` AS m
JOIN `lwljhb_lwl_players` AS p
JOIN `lwljhb_users` AS u
ON    m.id = p.match_id AND
      p.player_id = u.id
WHERE league_seasons_id = 12 AND
      playoff_round = 0
ORDER BY u.display_name, m.date_played;

SELECT po.*,
  @rn := if ( @display_name = po.display_name,
        @rn + 1,
        if ( @display_name := po.display_name, 1, 1)
        ) as Ordinal
FROM pre_ordinal AS po
JOIN (select @rn := 0, @display_name:=null) x
ORDER BY po.display_name, po.date_played;

如果我使用CREATE OR REPLACE VIEW,Ordinal列几乎全是1。我注意到,在极少数情况下,我得到一个Ordinal> 1,当匹配表的id是连续的时(记录是按照物理顺序?)。

我想在WordPress插件中使用我的SQL来创建图表。该插件由于某种原因不适用于多个语句,因此DROP TABLE; CREATE TABLE方法不会飞,而CREATE OR REPLACE VIEW只是一个语句并且有效,它只会得到错误的答案

为什么会这样?

1 个答案:

答案 0 :(得分:1)

https://dev.mysql.com/doc/refman/5.7/en/create-view.html部分说:

  

视图定义中允许使用ORDER BY,但如果使用具有自己的ORDER BY的语句从视图中进行选择,则会忽略它。

显然,关于ORDER BY和视图的真相可能是总是忽略了ORDER BY。

由于评估顺序在您的查询中至关重要,我认为使用视图并不可靠。