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