我的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吗?
答案 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';