在 MySQL 中,使用 VIEW 与使用 @vars 时的结果不同 TABLE
In MySQL, Different Results with VIEW vs TABLE when using @vars
我认为使用视图或 table 或临时 table 会得到相同的结果。
我正在创建一些输出,以用于另一个适用于 CREATE TABLE
或 CREATE TEMPORARY TABLE
但不适用于 CREATE VIEW
.
的语句
我正在创建的输出使用来自 3 个连接的 table 的字段。有趣的部分是我使用 IFs
和 @vars
在输出中生成的新字段,以在组内添加序号。这是输出 w/o 序数字段的一些示例数据:
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
下面是我希望添加新序数列后的样子:
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。我注意到,在极少数情况下,每次我都得到一个序号 >1 的时候,匹配项 table 的 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 和视图的真相可能是它总是忽略 ORDER BY。
由于评估顺序在您的查询中至关重要,因此我认为使用视图并不可靠。
我认为使用视图或 table 或临时 table 会得到相同的结果。
我正在创建一些输出,以用于另一个适用于 CREATE TABLE
或 CREATE TEMPORARY TABLE
但不适用于 CREATE VIEW
.
我正在创建的输出使用来自 3 个连接的 table 的字段。有趣的部分是我使用 IFs
和 @vars
在输出中生成的新字段,以在组内添加序号。这是输出 w/o 序数字段的一些示例数据:
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
下面是我希望添加新序数列后的样子:
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。我注意到,在极少数情况下,每次我都得到一个序号 >1 的时候,匹配项 table 的 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 和视图的真相可能是它总是忽略 ORDER BY。
由于评估顺序在您的查询中至关重要,因此我认为使用视图并不可靠。