UNION ALL
에 의해 조인 된 두 개의 SELECT 문이 있습니다. 첫 번째 명령문에서 where 절은 이전에 사용자에게 표시된 행만 수집합니다. 두 번째 명령문은 사용자에게 표시되지 않은 모든 행을 수집하므로 결과는 처음에 볼 수 있고 결과는 볼 수 없습니다.두 개의 열 값이 하나의 그룹을 만드는 각 그룹의 행 수 선택
당연히 간단한 ORDER BY
을 사용하는 동일한 select 문을 사용하면이 작업을 간단하게 수행 할 수 있습니다. 그러나 내가 수행하기를 바란다는 것을 알게 된 후에는 두 개의 개별 선택에 대한 이유가 간단합니다.
다음 구조와 데이터를 고려하십시오.
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 1 | 1 | 10 | true | .... |
| 2 | 10 | 1 | true | .... |
| 3 | 1 | 10 | true | .... |
| 4 | 6 | 8 | true | .... |
| 5 | 1 | 10 | true | .... |
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
| 13 | 10 | 1 | false | .... |
| 14 | 1 | 10 | false | .... |
| 15 | 6 | 8 | false | .... |
| 16 | 10 | 1 | false | .... |
| 17 | 8 | 6 | false | .... |
| 18 | 3 | 2 | false | .... |
+----+------+-----+--------+------+
은 기본적으로 내가 그이 viewed
열이 매우 단순하고 간단 true
또는 false
입니다 날씨를 확인하여 수행됩니다, 이외의 모든 볼 행이 문에 의해 선택 받기를 원하시면, 아무것도 여기 걱정할 필요가 없습니다.
그러나 열이 이미 표시되어있는 경우 (열 viewed is TRUE
) 해당 레코드의 경우 각 그룹에 대해 3 행만 반환하면됩니다.
이 인스턴스의 적절한 결과는 각 그룹의 가장 최근 행 3 개이어야합니다.
+----+------+-----+--------+------+
| id | from | to | viewed | data |
+----+------+-----+--------+------+
| 6 | 10 | 1 | true | .... |
| 7 | 8 | 6 | true | .... |
| 8 | 10 | 1 | true | .... |
| 9 | 6 | 8 | true | .... |
| 10 | 2 | 3 | true | .... |
| 11 | 1 | 10 | true | .... |
| 12 | 8 | 6 | true | .... |
+----+------+-----+--------+------+
이상적인 결과 집합에서 알 수 있듯이 세 가지 그룹이 있습니다. 따라서 조회 된 결과에 대한 원하는 조회에는 발견 된 각 그룹에 대해 최대 3 개의 행이 표시되어야합니다. 이 경우이 그룹은 10 개가 1이고 8 개가 6인데 둘 다 표시 할 행이 3 개가 있고 다른 그룹 2는 3 개만 표시 할 행이 하나 있습니다.
여기서 from = x
및 to = y
은 from = y
및 to = x
인 것처럼 동일한 그룹을 만듭니다. 따라서 첫 번째 그룹화 (10을 1로 함)를 고려하면 과 to = 1
은 from = 1
과 to = 10
인 경우 동일한 그룹입니다.
전체 테이블에는 그룹의 수가 많아서 select 문에 가장 최근에 반환 된 그룹이 3 개만 있고 내 문제가 있습니다. 가장 효율적인 방법으로 어떻게 완료 할 수 있는지 확신하지 못합니다. 가능하다면 테이블에는 수천 가지의 레코드가있을 것입니다.
도움 주셔서 감사합니다.
참고 : 성능에 도움이 id
는 from
, to
및 viewed
이 색인 열.
추신 : 정확하게이 질문의 이름을 지정하는 방법에 대해 확신이 없습니다. 더 좋은 아이디어가 있다면 내 손님이되고 제목을 편집하십시오.
나는 당신의 권리를 얻을 경우 "그룹은"'from'and'의 독특한 조합으로 정의된다 'values {x, y} 값 순서에 관계없이. 당신은 아마도 이것을 처음에 더 분명하게해야합니다. 완전한 대답이 없으면 역순으로 정렬 된 쌍을 집계하는 DISTINCT, GROUP BY 및 UNION이 친구 여야한다고 생각합니다. – matthias
@Matze가 말한 것 이외에도 "가장 최근의"는 "가장 높은 ID 값"을 의미한다고 생각합니다. 옳은? –
@OllieJones : 물론 가능합니다. –