在一对多关系查询期间使用LIMIT

时间:2013-03-28 01:10:30

标签: mysql sql

我有两个表tabAtabB,并且tabAtabB之间存在一对多的关系。我有查询:

SELECT * FROM `tabA` LEFT JOIN `tabB` ON `tabA`.`aID` = `tabB`.`aID`

并且返回的行是一个较大的集合,其中tabAtabB的每个tabA引用都有多个重复项。

我知道我可以使用GROUP BYtabA行限制为唯一元素,除非我使用GROUP_CONCAT函数使用自定义字段,并结合两个{{ 1}}用于转义的函数(严重影响性能),我松开REPLACE中包含的所有行中的一行。示例查询如下所示:

tabB

该查询将允许我使用 SELECT `tabA`.*, GROUP_CONCAT(REPLACE(REPLACE(`tabB`.`tabBCol1`, '/', '//'), ',', '/,')) AS `tabBCol`, GROUP_CONCAT(REPLACE(REPLACE(`tabB`.`tabBCol2`, '/', '//'), ',', '/,')) AS `tabBCo2` FROM `tabA` LEFT JOIN `tabB` ON `tabA`.`aID` = `tabB`.`aID` GROUP BY `tabA`.`aID` 语法,因此我可以(例如)仅显示5个条目,从5开始(即LIMIT)。当我将其应用于前一个查询时,我将不会获得接下来的5个查询,而是基于关联数量的随机数据集。

因此,除了第二个查询之外,是否有任何方法可以获取行,并且有关联,但是允许使用LIMIT 5,5语法,并且没有过多的{{1}的性能影响函数?

其他

虽然我可以为每一行使用多个子查询,但使用带有LIMIT语法的第一个查询(这将允许我为关联应用任何REPLACE条件),我试图找到一种方法避免N + 1选择问题(尽管在这个例子中,我的GROUP BY语法是WHERE,我将把它应用于更大的LIMIT s(一次最多1000行) )。

1 个答案:

答案 0 :(得分:1)

尝试两个查询:

// get those 5 records
SELECT * FROM Cars   WHERE some_conditon = blabla LIMIT 5;

// get all associated records from related table
SELECT * FROM Wheels WHERE car_id IN (1, 3, 5, 123, 16);

在结果中不会有任何N问题,因为您将始终有两个查询。即使你在第一个查询中有1000条记录,使用这个简单方法总是比使用/ concats / etc连接/分组更好。