Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mysql cross join, but without duplicated pair?

Let's say I have the following row in my table

table rows

id
63
64
65
66
67
68

if I run the following query, I get 30 rows.

SELECT r1.id, r2,id 
  FROM rows AS r1 
    CROSS JOIN rows AS r2 
  WHERE r1.id!=r2.id

result:

63  64
65  64
66  64
67  64
68  64
64  63
65  63
66  63
67  63
68  63
63  65
64  65
66  65
67  65
68  65
63  66
64  66
65  66
67  66
68  66
63  67
64  67
65  67
66  67
68  67
63  68
64  68
65  68
66  68
67  68

how would I get the following result instead of the above?

63,64  
63,65   
63,66
63,67
63,68

64,65
64,66
64,67
64,68

65,66
65,67
65,68

66,67
66,68

67,68

as you see, I don't want to get both 63,64 and 64,63, for example.

like image 831
Moon Avatar asked Mar 21 '11 18:03

Moon


2 Answers

Simple, only join with values higher than the current one.

select r1.id, r2,id 
from rows r1 
cross join rows r2 
where r1.id < r2.id
like image 97
a'r Avatar answered Nov 18 '22 09:11

a'r


Just add one condition. Left side to be always smaller then right. This will eliminate all the unwanted cases.

select r1.id, r2,id from rows as r1 cross join rows as r2 where r1.id!=r2.id and r1.id <r2.id
like image 43
Zimbabao Avatar answered Nov 18 '22 09:11

Zimbabao