2016-12-07 5 views
-1

複雑すぎるとは言わないMySQL内の問題の解決策を探しています。複数のテーブルデータのMySQLクエリ

基本的に2つのテーブルを使用したいと思います。 最初は、私は2番目のテーブル内の調達に関する情報を格納したい

ID Description Value AdditonalInfo 
1 Resistor  1.0R R0402 
2 Capacitor 100nF C0805 
3 Capacitor 10nF C0603 
... 

などの電子部品のリストを含んでいます。

ID Component Manufacturer Partnumber Timestamp 
1 2   TDK   XXXYYYZZZ 5 
2 2   Kemet  AAABBBCCC 10 
3 1   Multicomp 111222333 3 
... 

ご覧のとおり、各コンポーネントに複数の製造元を追加することは可能です。

ここでは、すべてのコンポーネント情報がある場合は を含む単一のテーブル(ビュー)を生成したい場合は、そのメーカーの最新のエントリを表示します。

ID Description Value AdditonalInfo Manufacturer Partnumber 
1 Resistor  1.0R R0402   Multicomp 111222333 
2 Capacitor 100nF C0805   Kemet  AAABBBCCC 
3 Capacitor 10nF C0603   (NULL) 

だろう与え例えば

が、これは単一のクエリ内で可能でしょうか?または少なくとも が最終テーブルを生成する何らかの種類のクエリを使用していますか?私はJOINコマンドがそれをするかどうかを知ることができませんでした。

私はこの解決策を見つけるための助けやヒントをいただきたいと思います。 ありがとう!

+0

私は1つのクエリでは、このテーブルを生成することができます動作しない場合は私に知らせて、それもそれほどパフォーマンスが悪いかもしれません。それは大丈夫ですか?その場合は、DMLクエリとDDLクエリを追加します。 –

+0

「OUTER JOIN」と「GROUP BY」コンポーネント「HAVINGタイムスタンプ=最大(タイムスタンプ)」 – JimmyB

答えて

0

次のクエリは、あなたが何をしているかを示すはずです。

すべてのコンポーネントについて、最新のエントリでコンポーネントをグループ化するsourcingテーブルに対して、サブクエリに一致するエントリが表示されます。

サブクエリはコンポーネントに基づいて結合され、max(タイムスタンプ)はソーシングテーブルの別のコピーに結合され、必要な残りの情報を取得します。

SELECT a.ID, a.Description, a.Value, a.AdditonalInfo, 
     c.Manufacturer, c.Partnumber 
FROM componentTable a 
LEFT JOIN (SELECT component, max(timestamp) AS maxTime 
      FROM sourcingTable 
      GROUP BY component 
     ) b 
    ON a.id = b.component 
INNER JOIN sourcingTable c 
    ON b.component = c.component 
    AND b.maxTime = c.timestamp 

あなたはLEFT JOININNER JOIN部品の周りに追加のブラケットを必要とするが、これは最初に試してみると、それは

+0

ええ、ありがとう。これは、b.Manufacturerとb.Partnumberをcと置き換えると正常に動作しているようです。*クエリの2行目に表示されます。 – Timonius

0

これはあなたの試してみる:

SELECT * FROM table1 LEFT JOIN table2 on table1.id = table2.id 
+0

LEFT JOINでは、部分的に機能します。しかし、コンポーネントに複数の製造元エントリがある場合は、1つのコンポーネントに対して複数の行が表示されます。その場合ですが、最新の製造元のエントリでコンポーネントごとに1行を取得したいだけです。 – Timonius

+0

@TimoKlingebergは、どの部分がうまくいかないか、あなたが見たいと思っていることを見ていない結果を説明できますか?それは答えに間違っているかもしれないことを理解するのに役立ちます –

0

あなたはコンポーネントの列に索引がある場合は、登録しようとクエリを使用してデータを取得することができます。

SELECT 
* 
FROM components 
    INNER JOIN store USING(id) 

をこのクエリは、十分な、あなたが必要としないだろう冗長データを格納します。

関連する問題