2010-01-18 88 views
5

我在t2運行與加入一個簡單的查詢,類似於SQL查詢從一個表,而不是結果集

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

由於t1有-許多行(任意數量大於2 )LIMIT語句不返回t1的前5行和t2的相應條目,但是5行通常包含來自t1的2-3行。

如何編寫此查詢以獲得t1的前5行以及t2的相應條目?


使用MySQL 5.0.45。

回答

7
SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3 
LEFT JOIN t2 ON ... 

請注意,如果「按訂單」子句中使用的限制沒有,它沒有定義的5行,你會得到。如果這不是你想要的,考慮添加一個'order by'子句。

+0

請注意,這個解決方案有MySQL的可擴展性問題,以及如果他希望在t2中的字段進行排序,則不起作用。 – hobodave 2010-01-18 09:24:17

+0

@hobodave幸運的是,我在t1中定義了一個字段。 – 2010-01-18 14:55:23

+0

@Robert:您可能會發現需要應用ORDER BY兩次 - 一次在內部查詢中選擇前五行,然後再次在外部查詢中確保結果按相同順序返回。 – 2010-01-18 15:01:10

0

我相信以下將做的伎倆:

SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5 
+0

感謝您的回答。由於t2中有多個條目對應於t1,所以我得到'ERROR 1242(21000):子查詢返回多於1行「。 – 2010-01-18 09:22:21

2

這是一個經典的分頁查詢。我建議將它分解爲兩個查詢:

SELECT DISTINCT t1.id FROM t1 LEFT JOIN t2 ON ... LIMIT 5 

把這些ID的,並放置在下面的查詢:

SELECT t1.a, t2.b FROM t1 LEFT JOIN t2 ON ... WHERE t1.id IN (?,?,?,?,?) 
+0

感謝您的回答。 1-query解決方案是可取的,並已提供。 – 2010-01-18 09:20:35

+0

np,只需注意派生表解決方案以及SELECT *的性能影響。 – hobodave 2010-01-18 09:21:34

+0

這也是一個很好的觀點。現在,派生表需要查看〜8k行,並且速度夠快。另外,我不會'使用'SELECT *'。 – 2010-01-18 09:23:58

0

您可以通過在T1獨特的欄目組是:

SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5 

但是您是否需要t2表按特定順序?

+0

感謝您的回答。請看我的問題,我需要返回多於5行,它是從t2開始的10行以及來自t1的_exactly_ 5行。接受的答案有一個很好的解決方案。 hobodave的一個也適用。 – 2010-01-18 14:53:36

+0

啊是的 - 有道理,沒有正確閱讀這個問題。接受的答案很好。你也可以用統計唯一行但變得混亂的變量來做到這一點。 – TimoSolo 2010-01-19 11:20:32