如何从union all join查询中删除重复项

时间:2012-09-13 09:30:57

标签: mysql distinct min

我有一张表格,其中包含这些部分号码的分号和价格。这是我的主表,大约有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。这对于大量数据来说非常慢。

我确信有一种方法只能获得价格最低的部分编号,如果该部分编号存在于多个表中,并且如果它仅存在于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`

也许有更好的方法,在这种情况下,我都是耳朵。但是,知道我对上述情况感到满意。

1 个答案:

答案 0 :(得分:2)

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