2010-01-18 48 views
5

我在t2运行与加入一个简单的查询,类似于SQL查询从一个表,而不是结果集

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

由于t1有-许多行(任意数量大于2 )LIMIT语句不返回t1的前5行和t2的相应条目,但是5行通常包含来自t1的2-3行。

如何编写此查询以获得t1的前5行以及t2的相应条目?


使用MySQL 5.0.45。

回答

7
SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3 
LEFT JOIN t2 ON ... 

请注意,如果“按订单”子句中使用的限制没有,它没有定义的5行,你会得到。如果这不是你想要的,考虑添加一个'order by'子句。

+0

请注意,这个解决方案有MySQL的可扩展性问题,以及如果他希望在t2中的字段进行排序,则不起作用。 – hobodave 2010-01-18 09:24:17

+0

@hobodave幸运的是,我在t1中定义了一个字段。 – 2010-01-18 14:55:23

+0

@Robert:您可能会发现需要应用ORDER BY两次 - 一次在内部查询中选择前五行,然后再次在外部查询中确保结果按相同顺序返回。 – 2010-01-18 15:01:10

0

我相信以下将做的伎俩:

SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5 
+0

感谢您的回答。由于t2中有多个条目对应于t1,所以我得到'ERROR 1242(21000):子查询返回多于1行“。 – 2010-01-18 09:22:21

2

这是一个经典的分页查询。我建议将它分解为两个查询:

SELECT DISTINCT t1.id FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

把这些ID的,并放置在下面的查询:

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... WHERE t1.id IN (?,?,?,?,?) 
+0

感谢您的回答。 1-query解决方案是可取的,并已提供。 – 2010-01-18 09:20:35

+0

np,只需注意派生表解决方案以及SELECT *的性能影响。 – hobodave 2010-01-18 09:21:34

+0

这也是一个很好的观点。现在,派生表需要查看〜8k行,并且速度够快。另外,我不会'使用'SELECT *'。 – 2010-01-18 09:23:58

0

您可以通过在T1独特的栏目组是:

SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5 

但是您是否需要t2表按特定顺序?

+0

感谢您的回答。请看我的问题,我需要返回多于5行,它是从t2开始的10行以及来自t1的_exactly_ 5行。接受的答案有一个很好的解决方案。 hobodave的一个也适用。 – 2010-01-18 14:53:36

+0

啊是的 - 有道理,没有正确阅读这个问题。接受的答案很好。你也可以用统计唯一行但变得混乱的变量来做到这一点。 – TimoSolo 2010-01-19 11:20:32

相关问题