MySQL查询限制结果由子表
我真的很困扰这个查询,我希望有人能帮助。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,而我真的想不出来!
有人能帮我一把吗?
很多谢谢。
请务必记住JOIN
可以位于子查询和表格中。你可以建立一个子查询,返回你想要查看的结果,一旦你有了你想要的数据,就可以在父查询中加入它。
很难“量身定做”这是专门针对你的问题,因为它太模糊(因为你承认)的答案,知道什么数据和表格真正的样子,但作为一个例子:
说table1
有四个字段:id
,revision_no
,name
和stuff
。你想要返回一个明确的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)
它不可能是一个“工作版本” - 除非我们对“工作”有很不同的理解 - 这是一个耻辱,因为它开始的很好。 :-( – Strawberry
为什么?)小提琴演示了一个任意查询,它使用连接返回具有“max”值的行,它按照它的意图执行,因此“正在工作” –
您正在返回id和东西的不确定值 – Strawberry
在你的情况下,你只需要从表一列,使这个,而不是在你的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 != '';
编辑您的问题,并提供样本数据和期望的结果。 –