MySQL:JOIN ON SELECT UNION的条件

时间:2014-01-16 19:00:54

标签: mysql sql join

我的MySQL查询的想法是创建某种类型的表的联合,例如供应商(例如零售商,批发商等)。一旦我有供应商,我想选择分配给订单的供应商的名称和地址。

我有一个加入:

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值都会变得难看。   性能方面,是的,这可能是最好的选择。工会   看起来有点笨重。想法?

问题2 :我必须在我的JOIN条件下使用CONVERT(),其中字段来自UNION。 UNION字段是COERCIBLE,所有其他字段都是latin_swedish。你认为在条件中使用CONVERT()会减慢我的JOIN吗?

1 个答案:

答案 0 :(得分: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';