2012-09-13 32 views
3

我有一個表,它包含partnumbers和這些partnumbers的價格。這是我的主表,大約有100000個條目。我也有可能的供應商3桌。並非主表的所有分部都在3個供應商表中,而3個供應商表也有不同的內容。如何從工會刪除重複所有加入查詢

我想要的是查詢我的主表partnumbers 3表。如果在多個表格中找到零件號碼,它應該只返回最低價格。如果僅在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` 

這給了我所有我需要的數據,在那之後我檢查的最低價格,並刪除了更高的價格partnumbers用foreach PHP代碼。對於大量數據,這是非常緩慢的。

我確定有一種方法只能獲得最低價格的partnumber,如果該partnumber存在於多個表中,並且只返回價格(如果它只存在於一個表中)。我只是不知道如何查詢它的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` 

也許有更好的方法,在這種情況下,我洗耳恭聽。但是爲了知道我對上述感到滿意。

回答

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 
+0

謝謝eggyal,你的回答讓我走上正軌。使用的解決方案添加到我的問題 –

+0

@MarcBuurke:您的解決方案將返回所有部件,無論它們出現的表的數量如何。你的問題說你只想要在多個表中存在的分號......或者我誤解了? – eggyal

+0

是的,你做了,或者我應該更清楚。我編輯了這個問題,強調如果它只出現在一個表中,我需要一個partnumber。 –