2012-05-19 89 views
1

可以說我有兩個表:爲什麼MySQL會加入循環集?

english其中有兩列,idletter

1,a 
2,b 
3,c 

greek其中有兩列,idletter

1,alpha 
2,beta 
3,gamma 

好所以我執行查詢select * from english limit 1,5 ,我得到:

2,b 
3,c 

這是我所期望的。現在,我嘗試select english.id,english.letter,greek.letter from english join greek on greek.id=english.id order by english.id asc limit 1,5

2,b,beta 
3,c,gama 
1,a,alpha 
2,b,beta 
3,c,gama 

什麼!爲什麼這是圓形的?好了好了,這下查詢的工作,我所期望的:

select english.id,english.letter,greek.letter from english join greek on greek.id=english.id group by english.id order by english.id asc limit 1,5

2,b,beta 
3,c,gama 

那麼這到底是怎麼回事?爲什麼我需要爲設置添加group by english.id以符合我的預期?

+0

使用LIMIT子句時沒有ORDER BY不作任何感。 –

+0

@Vincent Savard同意這是一個錯字,我通過真正的查詢命令。 – rook

回答

5

您的greek表中可能有重複的行。

當我在MySQL 5.5.20上試用它時,它工作正常:sqlfiddle

此處,我特意在greek表中插入重複行的例子,當你得到它給完全相同的結果:sqlfiddle

+0

我不這麼認爲,因爲那樣我就不得不添加一個條款... +1 sqlfiddle太棒了!我更新了一下,它看起來更像是我得到的,但它不是循環的......另外'g_id = english.id'不是它實際上是'r_id = english.id'的查詢,它返回適當的設置...我現在更加困惑。 – rook

+1

@Rook:只要運行'SELECT * FROM greek',你就會看到它是否有重複。 –

+0

@ypercube和馬克·拜爾斯打來電話...... – rook

1

限制適用於整個查詢。如果你想限制特定的表,申請限制其第一

select english.id,english.letter,greek.letter 
from (select * from english limit 1,5) as english 
join greek on greek.id=english.id 

你應該穿上LIMIT子句ORDER BY,除非它的東西隨機

+0

是的,我確實有一個訂單...... – rook