2017-10-09 138 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,namestuff。你想要返回一個明確的name值列表,其最新版本爲stuff(我們假裝因版本而異)。與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 sub_table_1 ON sub_table_1.id = main_table.id 

.... ....與

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 

...這會允許join與一個更符合你想要加入的記錄集(再次,不要掛上我用過的實際查詢,它只是在那裏來演示該方法)。

可能有更好的方法來達到這個目的,但有時候最好先從一個簡單的解決方案開始,這個解決方案更容易複製,然後在對通用解決方案有所瞭解之後進行簡化。

希望這有助於 - 正如我所說的那樣,只要我不知道所使用的真實數據,就可以提供具體信息。

(爲參考起見,here is a fiddle with a working version of the above example query

+0

它不可能是一個「工作版本」 - 除非我們對「工作」有很不同的理解 - 這是一個恥辱,因爲它開始的很好。 :-( – Strawberry

+0

爲什麼?)小提琴演示了一個任意查詢,它使用連接返回具有「max」值的行,它按照它的意圖執行,因此「正在工作」 –

+0

您正在返回id和東西的不確定值 – Strawberry

0

在你的情況下,你只需要從表一列,使這個,而不是在你的SELECT子句比加入一個子查詢。您可以通過按修訂號降序排列並將結果限制爲一行來獲得最新版本。

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 != '';