0

私のMySQLデータベースには、次productsの行に沿ったテーブルがあります

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

id主キーで、typeENUM('personal','industrial')です。個人用製品と工業用製品の両方に、いくつかの追加情報がproducts_personalおよびproducts_industrialテーブルに格納されています。どちらも形です

pid | additional info [...]

wherepidは で外部キー化されproducts.id、追加情報は と で異なりproducts_personalますproducts_industrial。私のテーブルには、2 つの関数 ( ~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)。

このタイプのクエリを実行するためのよりクリーンなテーブルまたはクエリ構造はありますか?

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 に答える