3

部品番号とそれらの部品番号の価格を保持するテーブルがあります。これは、約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`

これにより、必要なすべてのデータが得られます。その後、最低価格を確認し、foreachphpコードで高価格の部品番号を削除します。これは、大量のデータセットでは非常に低速です。

その部品番号が複数のテーブルに存在する場合にのみ最低価格の部品番号を取得し、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`

おそらくもっと良い方法があります。その場合、私はすべての耳です。しかし、知っているので、私は上記に満足しています。

4

1 に答える 1

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
于 2012-09-13T09:54:22.670 に答える