0

在我的 MySQL 数据库中,我有一个products表格

id | type | name | weight | base_price | [...]

whereid是主键,typeENUM('personal','industrial'). 个人和工业产品都在products_personalproducts_industrial表中存储了一些附加信息。两者都是形式

pid | additional info [...]

pid外键在哪里和products.id的附加信息不同。在我的表中,我有两个函数(通过)和. 这些函数使用和一些附加信息来计算最终价格。products_personalproducts_industrialCREATE FUNCTIONPRICE_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结果进行排序)。

是否有更简洁的表或查询结构来完成此类查询?

4

1 回答 1

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?他们可能应该被索引。

于 2012-06-09T22:59:27.707 回答