我在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。
我在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。
SELECT t3.a, t2.b FROM (SELECT * FROM t1 LIMIT 5) t3
LEFT JOIN t2 ON ...
請注意,如果「按訂單」子句中使用的限制沒有,它沒有定義的5行,你會得到。如果這不是你想要的,考慮添加一個'order by'子句。
我相信以下將做的伎倆:
SELECT t1.a, (SELECT t2.b FROM t2 WHERE t2... = t1...) AS b FROM t1 LIMIT 5
感謝您的回答。由於t2中有多個條目對應於t1,所以我得到'ERROR 1242(21000):子查詢返回多於1行「。 – 2010-01-18 09:22:21
這是一個經典的分頁查詢。我建議將它分解爲兩個查詢:
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 (?,?,?,?,?)
感謝您的回答。 1-query解決方案是可取的,並已提供。 – 2010-01-18 09:20:35
np,只需注意派生表解決方案以及SELECT *的性能影響。 – hobodave 2010-01-18 09:21:34
這也是一個很好的觀點。現在,派生表需要查看〜8k行,並且速度夠快。另外,我不會'使用'SELECT *'。 – 2010-01-18 09:23:58
您可以通過在T1獨特的欄目組是:
SELECT * FROM t1 JOIN t2 ON ... GROUP BY t1.id LIMIT 5
但是您是否需要t2表按特定順序?
感謝您的回答。請看我的問題,我需要返回多於5行,它是從t2開始的10行以及來自t1的_exactly_ 5行。接受的答案有一個很好的解決方案。 hobodave的一個也適用。 – 2010-01-18 14:53:36
啊是的 - 有道理,沒有正確閱讀這個問題。接受的答案很好。你也可以用統計唯一行但變得混亂的變量來做到這一點。 – TimoSolo 2010-01-19 11:20:32
請注意,這個解決方案有MySQL的可擴展性問題,以及如果他希望在t2中的字段進行排序,則不起作用。 – hobodave 2010-01-18 09:24:17
@hobodave幸運的是,我在t1中定義了一個字段。 – 2010-01-18 14:55:23
@Robert:您可能會發現需要應用ORDER BY兩次 - 一次在內部查詢中選擇前五行,然後再次在外部查詢中確保結果按相同順序返回。 – 2010-01-18 15:01:10