我有两个表tabA
和tabB
,并且从tabA
到tabB
有一对多的关系。我有查询:
SELECT * FROM `tabA` LEFT JOIN `tabB` ON `tabA`.`aID` = `tabB`.`aID`
并且返回的行是一个很大的集合,其中每个
tabA
对tabB
的引用都来自tabA
多个重复项。我知道我可以使用
GROUP BY
将tabA
行限制为唯一元素,除非我使用通过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加入/分组更好。