我有这样的结构:
mainTable
article | brand | price
ocm10 | someBrand1 | 100
ocm20 | someBrand1 | 200
ocm30 | someBrand2 | 300secondTable
article | brand | price
ocm30 | someBrand1 | 320
ocm10 | someBrand1 | 120thirdTable
article | brand | price
ocm20 | someBrand1 | 230
ocm40 | someBrand1 | 430
ocm50 | someBrand3 | 530现在我有这样的疑问:
SELECT article,
mainTable.brand AS priceBrand,
mainTable.price AS priceTableMain,
secondTable.price AS priceTableSecond,
thirdTable.price AS priceTableThird,
min(ifnull(mainTable.price, 'inf'),
ifnull(secondTable.price, 'inf'),
ifnull(thirdTable.price, 'inf')) AS minPrice
FROM (SELECT article FROM mainTable
UNION
SELECT article FROM secondTable
UNION
SELECT article FROM thirdTable)
LEFT JOIN mainTable USING (article)
LEFT JOIN secondTable USING (article)
LEFT JOIN thirdTable USING (article);因此,我想看到:
article | brand | priceMainTable | priceSecond | priceThird | minPrice
ocm10 | someBrand1 | 100 | null | null | 100
ocm20 | someBrand1 | 200 | null | 230 | 200
ocm30 | someBrand2 | 300 | 320 | null | 300(因此,没有像ocm40这样的行,没有在第一个表中显示的ocm50 )
如何才能只获得行(在mainTable中表示)
因此,我将只有一行文章:ocm10, ocm20, ocm30与联合数据的价格?
这是小提琴:http://sqlfiddle.com/#!7/87df2/4/0
顺便说一句:我知道,同样的结构不是个好主意.在实际的应用程序表中是不同的,这只是一个示例。我可以有3张以上的表格:即使10张有连接等等.
发布于 2017-11-13 10:21:24
您应该能够将第一个表左转到其他两个表:
SELECT
t1.article,
t1.brand,
t1.price AS priceMainTable,
t2.price AS priceSecond,
t3.price AS priceThird,
MIN(t1.price,
COALESCE(t2.price, t1.price),
COALESCE(t3.price, t1.price)) AS minPrice
FROM mainTable t1
LEFT JOIN secondTable t2
ON t1.article = t2.article
LEFT JOIN thirdTable t3
ON t1.article = t3.article;请注意,我们使用了MIN的标量版本,它接受多个参数。COALESCE的逻辑是,第二个和第三个价格“推迟”到第一个价格,要么是NULL。因此,例如,如果第二个和第三个价格都是NULL,那么最低价格将由第一个价格决定,第一个价格是唯一可靠的可用信息。
https://stackoverflow.com/questions/47261754
复制相似问题