2017-10-09 134 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 != '';