2012-06-15 3 views
1

두 개의 테이블이 있습니다.MYSQL은 조인, 정렬 및 null 값으로 선택합니다.

1. sum = 3 
2. sum = 1 
3. sum = 5 
4. sum = null 
5. sum = -2 

우편 번호 (4)되지 않은이있다 : - (엄지 손가락의 합 상하 합계), 우리는 5 개 게시물이 예를 들어

SELECT DISTINCT(t2.id), t2.sum, t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY t2.sum DESC 

: 같은

Table 1. 
======== 
id 
post 
-------- 

Table 2. 
======== 
id 
post_id 
thumbs_sum 
-------- 

쿼리 보인다 표 2에 기록하십시오. 그 이유는 내 쿼리가 다음을 반환하는 이유입니다.

1. sum = 5 
2. sum = 3 
3. sum = 1 
4. sum = -2 
5. sum = null 

데이터베이스 테이블의 구조를 변경하고 PHP에서 결과를 정렬 할 수없는 경우이 문제를 어떻게 결정합니까? 당신이 주문에 숫자 0으로 NULL 값을 번역 할 경우

답변

3

저는 실제 질문이 무엇인지 알아 내려고합니다. "이 문제를 어떻게 결정할 것인가"는 다소 난해한 것입니다.

어쨌든 여기에 문제가있는 것은 투표가없는 게시물의 경우 합계가 null입니다. 우리가 주문할 때, 우리는 아마도 null을 0으로 대체하기를 원할 것입니다.

SELECT DISTINCT(t2.id), t2.sum, t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY IFNULL(t2.sum, 0) DESC 
+0

을,

귀하의 질문에 대답, 내가

order by ifnull(t2.sum, 0) DESC 

다른 옵션이 문제가 결코 그런 식으로 데이터베이스 테이블 디자인에서 0의 기본 값을 설정하는 것입니다 사용합니다! 감사합니다) – dearmisterrobot

+0

@Indeveler는 큰 데이터의 경우 매우 느려질 것이라는 점을 명심하십시오. 제가 준 솔루션을 사용해 볼 수도 있습니다. – SERPRO

3

,이 같은 ORDER BY 절을 향상시킬 수 있습니다

ORDER BY IFNULL(t2.sum, 0) DESC 

는 기억이 방법은 가능한 인덱스를 사용하는 MySQL의를 방지 함. 따라서 수천 개의 레코드를 주문하는 데 시간이 걸릴 수 있습니다.

2

COALESCE을 사용하지 않으시겠습니까?

SELECT DISTINCT(t2.id), COALESCE(t2.sum, 0), t1.id 
FROM table1 t 
    LEFT JOIN table2 t2 ON t2.post_id = t1.id 
ORDER BY t2.sum DESC 

이 함수는 널이 아닌 첫 번째 값을 가져옵니다.

3

선택 사항은 데이터 볼륨에 따라 되돌아 오는 데 더 오래 걸릴 수 있습니다. 예를 들어 "t2.id"그룹을 사용하는 것이 더 나을 것입니다. 결과는 동일하지만 더 빠를 것입니다. 도 성능을 향상시키기 위해 표를 색인 생성합니다. 신 오)

관련 문제