2017-10-09 15 views
0

私はこのクエリで本当に苦労しています。誰かが助けてくれることを願っています。MySQLサブテーブル別クエリの制限クエリ

複数のテーブルを照会して、必要なデータセットを取得しています。次のクエリは匿名バージョンです:

SELECT main_table.id, 
     sub_table_1.field_1, 
     main_table.field_1, 
     main_table.field_2, 
     main_table.field_3, 
     main_table.field_4, 
     main_table.field_5, 
     main_table.field_6, 
     main_table.field_7, 
     sub_table_2.field_1, 
     sub_table_2.field_2, 
     sub_table_2.field_3, 
     sub_table_3.field_1, 
     sub_table_4.field_1, 
     sub_table_4.field_2 
FROM main_table 
INNER JOIN sub_table_4 ON sub_table_4.id = main_table.id 
INNER JOIN sub_table_2 ON sub_table_2.id = main_table.id 
INNER JOIN sub_table_3 ON sub_table_3.id = main_table.id 
INNER JOIN sub_table_1 ON sub_table_1.id = main_table.id 
WHERE sub_table_4.field_1 = '' AND sub_table_4.field_2 = '0' AND sub_table_2.field_1 != '' 

クエリは動作しますが、私が持っている問題はsub_table_1はリビジョン番号(INT 11)を持っています。現在、異なるリビジョン番号と異なるバージョンのsub_table_1.field_1を使用して重複したレコードを取得していますが、最新のリビジョン番号で制限された結果のみを含むように結果セットを制限したいので、最新のsub_table_1_field_1しか提供できません。それを理解することはできません!

誰かが私に手を貸してくれますか?

多くのありがとうございます。

+0

質問を編集し、サンプルデータと希望する結果を提供してください。 –

答えて

-1

JOINは、サブクエリとテーブルの両方に置くことができます。表示したい結果を返すサブクエリを作成し、必要なデータを取得したら親クエリに結合します。

これは、データやテーブルが実際にどのように見えるかを知るために、それはあまりにも難読化されていますと(あなたが認めるように)、あなたに問題特定の答え「テーラー」に難しいですが、例として:

セイtable1がありid,revision_no,nameおよびstuffの4つのフィールドを含む。最新のバージョンstuff(リビジョンごとに異なると思われます)のname値の別のリストを返したいとします。 stuffの最新版で

返します

個々のnameを:(最後にフィドルを参照してください。注)

select t.* from table1 t 
inner join 
    (SELECT name, max(revision_no) maxr 
    FROM table1 
    GROUP BY name) mx 
    on mx.name = t.name 
    and mx.maxr = t.revision_no; 

:あなたはとして単独でこれを行うことができます。

あなたは釘付け、あなたがして...と....

INNER JOIN (select t.* from table1 t 
inner join 
    (SELECT name, max(revision_no) maxr 
    FROM table1 
    GROUP BY name) mx 
    on mx.name = t.name 
    and mx.maxr = t.revision_no) sub_table_1 
    ON sub_table_1.id = main_table.id 

....

INNER JOIN sub_table_1 ON sub_table_1.id = main_table.id 

を入れ替えることができることjoinとを許すことになるんだたら結合しようとしているものに合わせて調整されたレコードセットです(実際に使用した実際のクエリでハングアップしないでください)。

これを実現するうえでよりエレガントな方法があるかもしれませんが、複製が簡単な簡単なソリューションから始めて、何がなぜ妥当であるのかを一般的に理解してから簡単にしてください。

私が言っているように、あなたが使用している実際のデータを知らずに提供できるほど具体的です。

(参考のために、here is a fiddle with a working version of the above example query

+0

私たちは '働く'という全く異なる理解をしていなければ、それは「働くバージョン」ではありませんでした。 :-( – Strawberry

+0

なぜですか?フィドルは、「最大」値を持つ行を返すために結合を使用する任意のクエリを示します。それは意図したとおりに「働きます」 –

+0

あなたはidとstuffの不確定な値を返しています – Strawberry

0

あなただけのテーブルからの列を必要とする、あなたの場合には、このサブクエリあなたのselect句ではなく、参加するよりも作ります。リビジョン番号を降順に並べ替え、結果を1つの行に限定して最新のリビジョンを取得します。

SELECT 
    main_table.id, 
    (
    select sub_table_1.field_1 
    from sub_table_1 
    where sub_table_1.id = main_table.id 
    order by revision_number desc 
    limit 1 
) as sub_table_1_field_1, 
    main_table.field_1, 
    ... 
FROM main_table 
INNER JOIN sub_table_4 ON sub_table_4.id = main_table.id 
INNER JOIN sub_table_2 ON sub_table_2.id = main_table.id 
INNER JOIN sub_table_3 ON sub_table_3.id = main_table.id 
WHERE sub_table_4.field_1 = '' 
    AND sub_table_4.field_2 = '0' 
    AND sub_table_2.field_1 != ''; 
関連する問題