mysql - 在 MySQL 中,使用 @vars 时 VIEW 与 TABLE 的结果不同

标签 mysql create-table create-view

我认为使用 View 或表或临时表会得到相同的结果。

我正在创建一些输出以用于另一个与 CREATE TABLE 一起使用的语句中或 CREATE 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序数列几乎都是 1。我注意到,在极少数情况下,每次我都得到一个 Ordinal >1 时,匹配表的 ID 是连续的(记录是按物理顺序排列的?)。

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

为什么会这样?

最佳答案

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

ORDER BY is permitted in a view definition, but it is ignored if you select from a view using a statement that has its own ORDER BY.

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

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

关于mysql - 在 MySQL 中,使用 @vars 时 VIEW 与 TABLE 的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46892912/

相关文章:

mysql - SQL 连接 : counting rows and get most recent row from another table

mysql - 迁移后 Wordpress 无法写入数据库

mysql 创建表...我做错了什么

php - 如何从聊天对话中获取最后一条消息?

mysql - 在mysql中使用连接插入查询

android - SQLiteProvider/SQLiteLog 错误 : No such table: products

actionscript-3 - 我可以在 Actionscript 的 SQLite 查询中一次创建多个表吗?

mysql - 从 MySQL 中的多个表创建 View

python - CreateView 创建两个模型对象