我有一张表格,其中包含零件编号和这些零件编号的价格。这是我的主表,大约有 100000 个条目。我还有 3 张桌子和可能的供应商。并非主表的所有零件编号都在所有 3 个供应商表中,并且 3 个供应商表也有不同的内容。
我想要的是在 3 个表中查询我的主表的部件号。如果在多于 1 个表中找到零件号,则它应该只返回最低价格的一个。如果仅在 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 代码删除价格较高的零件号。这在大型数据集上非常慢。
我确信有一种方法可以仅在该零件号存在于 1 个以上的表中时才获得最低价格的零件号,如果它仅存在于 1 个表中,则只需返回价格。我只是不知道如何查询 mysql 数据库。我尝试使用连接、联合、最小和不同的组合,但无济于事。
有人可以帮我吗?
下面来自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`
也许有更好的方法,在这种情况下,我全神贯注。但要知道我对上述内容感到满意。