2012-05-19 52 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