2014-01-16 71 views
0

我的MySQL查詢的想法是創建特定類型的表的聯合,例如供應商(例如零售商,批發商等)。一旦我有供應商,我想選擇分配給訂單的供應商的名稱和地址。MySQL:JOIN ON SELECT UNION的條件

我有一個JOIN:

SELECT o.*, v.* 
FROM order o 
INNER JOIN (
    SELECT 'retailer' AS type, r.id AS type_id, r.name, r.address FROM retailer AS r 
    UNION ALL 
    SELECT 'wholesaler' AS type, w.id AS type_id, w.name, w.address FROM wholesaler AS w 
) AS v ON CONVERT(v.type AS utf8) = o.vendor_type AND CONVERT(v.type_id AS utf8) = o.vendor_type_id 

問題1:你覺得這是做到這一點的最好方法是什麼?

a)一個供應商表也不會有任何更好,除非有一個名字和 地址字段在供應商表中選擇;這似乎是多餘的 起名字和地址已經在供應商特定的表 (如零售商表)

B)也許LEFT JOIN每個供應商特定的表是最好的, 雖然NULL值處處會得到一種醜陋。 性能方面,是的,這可能是最好的選擇。 UNION 看起來有點笨重。思考?

問題2:我不必使用CONVERT()在我的JOIN條件,其中字段是從UNION到來。 UNION字段是COERCIBLE,所有其他字段都是latin_swedish。你認爲在條件下使用CONVERT()會減慢我的JOIN嗎?

+0

爲什麼他們分成不同的表? – Strawberry

+0

感謝您的詢問。他們分裂的原因是他們的目的非常不同;他們的關聯表也不一樣。上面的表名只是理論上的。 – axiom82

+0

在join中使用'convert()'可能會降低速度。 –

回答

1

以下是可能更有效,因爲它可以對retailer(id)wholesaler(id)使用索引:

SELECT o.*, coalesce(r.name, w.name) as name, coalesce(r.address, w.address) as address 
FROM order o left outer join 
    retailer r 
    on o.type_id = r.id and o.type = 'retailer' left outer join 
    wholesaler w 
    on o.type_id = w.id and o.type = 'wholesaler'; 
+0

謝謝。這也是我的想法。這可能很難在Zend_Db_Select中編寫。我想我會將COALESCE添加到Zend_Db_Select :: from()中。 – axiom82

+0

是的。我只是測試了它,它在Zend中像一個魅力一樣工作。我現在可以肯定,就像你一樣,左翼聯合在一起表現出色。 Muchas gracias。大豆feliz que tu我podria ayudar hoy。 – axiom82