【发布时间】:2019-04-22 18:07:47
【问题描述】:
我不确定如何限制查询中的第二次加入。在我准备的fiddle 中,我需要限制结果中每个用户的行数。
表a:
id | word
----------
1 | xyz
2 | zzz
表b:
name | word
------------
Peter | xyz
John | xyz
Jane | xyz
表c:
name | product
------------
Peter | blah
Peter | blah2
Peter | blah3
Peter | blah4
Peter | blah5
Peter | blah6
John | hello
John | world
John | blah
期望的结果:表 b 的前两个条目(用户 Peter 和 John)和每个用户在表 c 上加入的前两个条目。
name | word | product
----------------------
Peter | xyz | blah
Peter | xyz | blah2
John | xyz | hello
John | xyz | world
我当前的查询是
select c.name, first_join.word, c.product from (
select b.* from a
left join b on b.word=a.word
where a.id=1
limit 2
) first_join
left join c on c.name=first_join.name
它产生结果:
name | word | product
------------------------------
Peter | xyz | blah
Peter | xyz | blah2
Peter | xyz | blah3
Peter | xyz | blah4
Peter | xyz | blah5
Peter | xyz | blah6
John | xyz | hello
John | xyz | world
John | xyz | blah
你有什么想法吗?我找到了另一个讨论这个问题的线程,但我无法将其映射到我的案例。我知道结构并不完美,但我不允许更改表 c 的设计。
【问题讨论】:
-
请同时包含有问题的代码。
-
如果我有同样的任务,我会像你一样使用子查询。出于所有意图和目的,子查询与联接相同,只是您可以限制子查询中的记录数量。如果您的查询有效并且您对它没问题 - 不要再犹豫了。即使你要重写它,你最终也会得到相同的性能。
-
你可以尝试使用
union运算符