在我的MySQL数据库中,我有一个products
的表格
id | type | name | weight | base_price | [...]
其中id
是主键,type
是ENUM('personal','industrial')
。个人和工业产品都有一些存储在products_personal
和products_industrial
表格中的附加信息。两者都是
pid | additional info [...]
其中pid
使用products.id
进行外键操作,products_personal
和products_industrial
的其他信息不同。在我的表格中,我有两个功能(通过CREATE FUNCTION
),PRICE_PERSONAL(...)
和PRICE_INDUSTRIAL(...)
。这些函数使用base_price
和一些其他信息来计算最终价格。
我希望为我的所有产品创建id | type | name | [...] | price
的视图。我现在的候选人是
CREATE VIEW foo AS
SELECT id, type, name, [...], PRICE_PERSONAL(params) AS price
FROM products
INNER JOIN products_personal ON products.id = products_personal.pid
UNION
SELECT id, type, name, [...], PRICE_INDUSTRIAL(params) AS price
FROM products
INNER JOIN products_industrial ON products.id = products_industrial.pid
但这很笨重,似乎导致ORDER BY
效果不佳(因为它需要对未编入索引的UNION
结果进行排序)。
是否有更干净的表或查询结构来完成此类查询?
答案 0 :(得分:0)
实际上没有测试它,但尝试这样的事情:
CREATE VIEW foo AS
SELECT id, type, name, [...], PRICE_PERSONAL(params) AS price
FROM products
INNER JOIN products_personal ON products.id = products_personal.pid
WHERE type = 'personal'
UNION ALL
SELECT id, type, name, [...], PRICE_INDUSTRIAL(params) AS price
FROM products
INNER JOIN products_industrial ON products.id = products_industrial.pid
WHERE type = 'industrial'
想法是通过过滤products.type
来尽早切断“错误”的行。另外,我应该赞扬@ypercube发现UNION ALL
。
ORDER BY
下的字段是什么?它们应该被编入索引。