我正在处理一个包含mysql数据库的项目。
我想创建一个使查询更容易的视图。但我遇到了问题。由于视图中使用的表包含大约100.000行,并且我加入其中四个,因此视图必须使用合并算法。但根据MySQL documentaion:
如果视图包含以下任何内容,则MERGE 无法使用 构建体:
- 聚合函数(SUM(),MIN(),MAX(),COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- LIMIT
- UNION或UNION ALL
- 选择列表中的子查询
- 仅指文字值(在这种情况下,没有基础表)
那么如果已存在某些内容,我将如何插入查找
EXIST( SELECT id FROM table WHERE col > val) AS flag
或属于其他ID的最新ID
(SELECT id FROM payments WHER contract_id = val ORDER BY id DESC LIMIT 1) AS last_payment_id
进入视图,不使用子查询?目前我试图避免这种情况。在某些情况下,我可以添加一个有效的行周期(DATE valid_from,DATE valid_to),这样每个contract_id的al周期都是不同的,所以它是唯一的,所以我不需要排序或限制。但这真是难看。
是否有推荐的方法在没有子查询的情况下进行此类子查询?
或者我只是想欺骗我这些事情?
注意:对于所有视图,FROM子句中的子查询也是禁止的,因此也不是一个选项。
澄清:
我正在寻找一种方法来获得具有相同结果的视图,例如
CREATE VIEW viewName
AS
SELECT a.someColumn,
EXIST( SELECT a FROM table2 t WHERE t2.date > NOW()) AS flag,
(SELECT id FROM table3 ORDER BY id DESC LIMIT 1) AS latest_id
FROM table1
使用合并算法。
答案 0 :(得分:1)
使用DETERMINISTIC
和READS SQL DATA
指令创建一个存储函数,该指令接受执行子查询所需的任何参数。在函数内部执行子查询,并返回结果。
然后引用视图中的函数。
虽然看似反直觉,但这种抽象允许使用ALGORITHM=MERGE
声明视图,并进行相应处理,因此您不会遇到与TEMPTABLE
相关联的性能问题。 / p>