从MySQL结果中过滤等效但不重复的行

时间:2011-02-27 17:30:40

标签: mysql self-join

为了促进兄弟会中的联系,我正在设计一个系统,让人们可以评价彼此之间的相互了解程度,然后它会匹配那些彼此了解最少的人。这就是评级表的样子:

from_bro | to_bro | rating
--------------------------
A        | B      | 5
B        | A      | 5
B        | C      | 2
C        | B      | 3
A        | C      | 5
C        | A      | 5

我想设计一个查询,选择每对的平均值。到目前为止,我有这个:

SELECT *, (m1.rating + m2.rating)/2 AS average
FROM matches AS m1
LEFT JOIN matches AS m2
ON m1.from_bro = m2.to_bro
AND m1.to_bro = m2.from_bro

大部分都有效,但它包含冗余数据:

from_bro | to_bro | rating | from_bro | to_bro | rating | average
-----------------------------------------------------------------
A        | B      | 5      | B        | A      | 5      | 5.0000
B        | A      | 5      | A        | B      | 5      | 5.0000
B        | C      | 2      | C        | B      | 3      | 2.5000
C        | B      | 3      | B        | C      | 2      | 2.5000
A        | C      | 5      | C        | A      | 5      | 5.0000
C        | A      | 5      | A        | C      | 5      | 5.0000

查看第1行和第2行,第3行和第4行以及第5行和第6行如何不重复,基本相同。有没有办法可以过滤掉那些冗余的行?

1 个答案:

答案 0 :(得分:4)

如果to_bro和from_bro实际上是bro_id(数字),你可以添加:

AND m1.from_bro_id > m2.from_bro_id 

因此每只兄弟只能获得一条记录。

如果它们是字符串,您可以使用:

AND STRCMP(m1.from_bro, m2.from_bro) = 1 

这是一个字符串比较,意思是m1.from_bro> m2.from_bro