为了促进兄弟会中的联系,我正在设计一个系统,让人们可以评价彼此之间的相互了解程度,然后它会匹配那些彼此了解最少的人。这就是评级表的样子:
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行如何不重复,基本相同。有没有办法可以过滤掉那些冗余的行?
答案 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