我有两张表tabA
and ,从totabB
有一对多的关系。我有一个查询: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
语法的查询(这将允许我WHERE
为关联应用任何条件),我试图找到一种方法来避免 N+1 选择问题(尽管在这个例子中,我的LIMIT
语法是LIMIT 5,5
,我将把它应用到更大LIMIT
的 s(一次最多 1000 行))。