【发布时间】:2016-07-18 12:05:57
【问题描述】:
假设我有这个查询:
(SELECT pets.id, "pets" AS "table" FROM pets WHERE name="Joey")
UNION ALL
(SELECT toys.id, "toys" AS "table" FROM (SELECT id, "pets" AS "table" FROM pets WHERE name="Joey") AS parentQuery, toys WHERE type="Ball" AND pet_id=parentQuery.id)
UNION ALL
(SELECT owners.id, "owners" AS "table" FROM (SELECT id, "pets" AS "table" FROM pets WHERE name="Joey") AS parentQuery, owners WHERE name="Issac" AND pet_id=parentQuery.id)
SQL 小提琴:http://sqlfiddle.com/#!9/1637a/1
这里的想法是在多个一对多场景中获取相关行的 ID 列。 几个问题:
- 虽然我希望 MySQL 在某种程度上通过查询缓存结果进行优化,以便将相同的初始查询作为子查询嵌入到其他
UNION'ed 查询中,但是否可以安全、干净地使用SQL 变量(或其他)在其他查询中引用第一个查询的结果...以避免重复查询和任何捆绑参数再次为每个附加UNION'ed 查询? -
(可选) 如果您认为这是糟糕/鲁莽的 SQL 设计,请告诉我。我确信这可以通过
JOIN变体来完成,但我只是不确定有很多连接的性能是否会比像这样拆分它更好?我听到了不同的意见。
谢谢!我已经看到了这个响应,并认为类似的东西可以工作,但到目前为止我通常避免使用 SQL 变量,所以我不确定如何使用UNION'ed 查询来构造它:How to optimize huge query with repeated subqueries
【问题讨论】:
-
我觉得你可以尽可能快地测试排列。
-
好吧,我的第一个问题在这里最重要...避免在后续查询中重新捆绑初始查询。到目前为止,性能在测试中很好。
-
如果性能好删除问题。这是过早的优化。 AFAIK。由于 mysql 没有公用表表达式,因此无法避免重写该查询。
-
我为什么要删除问题?如果想回答它无法完成(请求......避免重复查询/参数),那就这么说。其他人可能有同样的问题!
-
你能分享一个sql fiddle吗?