我有两个表tabAtabB,并且从tabAtabB有一对多的关系。我有查询:

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


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

我知道我可以使用GROUP BYtabA行限制为唯一元素,除非我使用通过GROUP_CONCAT函数结合两个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`


该查询将允许我使用LIMIT语法,因此(例如)我只能显示5个条目(从5个后)(即LIMIT 5,5)。当我将其应用于前一个查询时,我将不会获得接下来的5个查询,而是基于关联数的随机数据集。

因此,除了第二个查询之外,还有什么方法可以获取具有关联的行,但是允许使用LIMIT语法,而又不会导致过多的REPLACE函数影响性能?

额外

尽管我可以为每行使用多个子查询,但是使用第一个查询使用语法(这将允许我对关联应用任何GROUP BY条件),但我正在尝试寻找一种避免N + 1选择的方法问题(尽管在此示例中,我的WHERE语法为LIMIT,但我将其应用于更大的LIMIT 5,5(每次最多1000行))。

最佳答案

尝试两个查询:

// 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加入/分组更好。

10-08 01:08