0

我有两张表tabAand ,从totabB有一对多的关系。我有一个查询:tabAtabB

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

并且返回的行是一个大集合,tabA每个对 的tabB引用都有多个重复项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语法的查询(这将允许我WHERE为关联应用任何条件),我试图找到一种方法来避免 N+1 选择问题(尽管在这个例子中,我的LIMIT语法是LIMIT 5,5,我将把它应用到更大LIMIT的 s(一次最多 1000 行))。

4

1 回答 1

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 条记录,使用这种简单的方法总是比 joins/groups by/concats/etc 更好。

于 2013-03-28T01:21:24.230 回答