我有兩個表tabA
和tabB
,並且存在從tabA
到tabB
的一對多關係。我有查詢:在一對多關係中使用LIMIT查詢
SELECT * FROM `tabA` LEFT JOIN `tabB` ON `tabA`.`aID` = `tabB`.`aID`
和返回的行是一大組來自tabA
多個複製爲每個tabB
參照tabA
。
我知道我可以使用GROUP BY
到tabA
行限制,以獨特的元素,除非我用用GROUP_CONCAT
功能自定義字段(S),有兩個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行))。
有兩件事情在我身上跳出來。一,你爲什麼要做一個左連接而不是內連接。二,而不是選擇*爲什麼不,選擇不同的只是你需要的領域? – 2013-03-28 01:25:53