[英]How can I remove duplicates from a union all join query
我有一张桌子,里面有这些零件号码的零件号和价格。 这是我的主表,大约有100000个条目。 我还有3个表可能的供应商。 并非主表的所有部件都在所有3个供应商表中,并且3个供应商表也具有不同的内容。
我想要的是在3个表中查询主表的partnumbers。 如果在多于1个表中找到partnumber,则它应该只返回最低价格。 如果仅在1个表中找到它,则返回该部分的价格。
我现在正在做的是以下查询:
SELECT `table1.partnumber`,
`table1`.`price`,
`maintable`.`price`
FROM `table1`
INNER JOIN `maintable`
ON `table1`.`partnumber` = `maintable`.`partnumber`
UNION ALL
SELECT `table2`.`partnumber`,
`table2`.`price`,
`maintable`.`price`
FROM `table2`
INNER JOIN `maintable`
ON `table2`.`partnumber` = `maintable`.`partnumber`
UNION ALL
SELECT `table3.partnumber`,
`table3`.`price`,
`maintable`.`price`
FROM `table3`
INNER JOIN `maintable`
ON `table3`.`partnumber` = `maintable`.`partnumber`
这给了我所需的所有数据,之后我检查了最低价格,并使用foreach php代码删除了更高价格的partnumbers。 这对大型数据集来说非常慢。
我确信有一种方法只能获得价格最低的partnumber,如果该partnumber存在于多个表中,并且只返回价格,如果它只存在于1个表中。 我只是不知道如何查询mysql数据库。 我尝试过使用连接,联合,min和distinct的组合,但无济于事。
有人可以帮我吗?
下面eggyal的回答让我顺道而上。 我现在有以下查询对我有用:
SELECT `partnumber`,MIN(`price`) as `price`
FROM (
SELECT `table1`.`partnumber`,
`table1`.`price`,
`maintable`.`price`
FROM `table1`
INNER JOIN `maintable`
ON `table1`.`partnumber` = `maintable`.`partnumber`
UNION ALL
SELECT `table2`.`partnumber`,
`table2`.`price`,
`maintable`.`price`
FROM `table2`
INNER JOIN `maintable`
ON `table2`.`partnumber` = `maintable`.`partnumber`
UNION ALL
SELECT `table3.partnumber`,
`table3`.`price`,
`maintable`.`price`
FROM `table3`
INNER JOIN `maintable`
ON `table3`.`partnumber` = `maintable`.`partnumber`
) AS `part` GROUP BY `partnumber`
也许有更好的方法,在这种情况下,我都是耳朵。 但是知道我对上述情况感到满意。
SELECT partnumber, MIN(price) FROM (
SELECT 1 AS tn, partnumber, table1.price
FROM table1 JOIN maintable USING (partnumber)
UNION ALL
SELECT 2 AS tn, partnumber, table2.price
FROM table2 JOIN maintable USING (partnumber)
UNION ALL
SELECT 3 AS tn, partnumber, table3.price
FROM table3 JOIN maintable USING (partnumber)
) t
GROUP BY partnumber
HAVING COUNT(DISTINCT tn) >= 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.