2015-01-14 2 views
-1

에 따라 position에 따라 DESC 순서로 IE를 설정하는 임시 테이블을 작성하는 중이므로 IE는 사용자가 갖는 점수가 높을수록 더 높은 순위를 갖게됩니다.임시 테이블에 행 위치 가져 오기 MySQL

SET @rownum := 0; 

SELECT t.`subscriber_id`, 
t.`total_points`, 
s.`account_type`, 
@rownum := @rownum + 1 AS `position` 
FROM `subscribers_points` t 
LEFT JOIN (
    SELECT `id`, `account_type` 
    FROM `subscribers` 
) s 
    on s.`id` = t.`subscriber_id` 
WHERE t.`year` = 2015 
AND t.`month` = 1 
ORDER BY t.`total_points` DESC 
:

, 여기에 내 코드 나 또한 position

그러나 현재 주어진 사용자를 얻기 위해이 테이블 밖으로 subscriber_id을 선택합니다

, 나는 이상한 많은 문제로 실행 해요 입니다

모든 1,238,1,2 및 9를 필터링하려고하지만, 언제든지 subscribers_points WHERE 절에 테이블을 추가하면 에 position이 없지만 subscriber_id은 기수가되어 이해가되지 않습니다. 나를.

설명을 위해 표 subscribersaccount_type 필드를 포함합니다. subscriber_points 테이블에는 total_points 필드가 들어 있습니다.

------------------------------------------------------------- 
| subscriber_id | position | total_points | account_type | 
------------------------------------------------------------- 
| 52   |  1  |  10  |  7  | 
| 125   |  2  |  8  |  4  | 
| 87   |  3  |  9  |  3  | 
| 12   |  4  |  5  |  6  | 
| 45   |  5  |  2  |  4  | 
------------------------------------------------------------- 

+0

결과 세트,하지만 데이터 세트. 천재. – Strawberry

답변

2

MySQL이 간 행 값을 계산하는 남았습니다입니다 미리 감사합니다 :

이 이상적인 테이블 보는 방법입니다

6 개 연속 값을 기본 간단한 테이블 :

mysql> create table foo (x int); 
mysql> insert into foo (x) values (0), (1), (2), (3), (4), (5); 

mysql> set @pos := 0; 
mysql> select @pos := @pos + 1, x from foo where x not in (2, 3); 
+------------------+------+ 
| @pos := @pos + 1 | x | 
+------------------+------+ 
|    1 | 0 | 
|    2 | 1 | 
|    3 | 4 | 
|    4 | 5 | 
+------------------+------+ 

모든 것이 정상적으로 보입니다. 우리는 두 개의 행을 삭제했습니다. 위치 번호는 순차적입니다. MySQL이 결과 집합에 행이 포함되어 있지 않으면 @pos update를 올바르게 평가하지 않은 것처럼 보입니다. 그러나 당신은 시스템에 어떤 주문을 추가 위치가 여전히 증가하는 방법을

mysql> set @pos := 0; 
mysql> select @pos := @pos + 1, x from foo where x not in (2, 3) order by x desc; 
+------------------+------+ 
| @pos := @pos + 1 | x | 
+------------------+------+ 
|    1 | 5 | 
|    2 | 4 | 
|    3 | 1 | 
|    4 | 0 | 
+------------------+------+ 

주, 우리가 행의 순서를 역전 한에도 불구하고. 테이블이 스캔되고 행이 포함/제외 될 때 @pos + 1 항목이 평가 될 것이라고 생각할 수 있습니다. 그러나. 그것은 어떻게 든 이루어집니다 후에 행이 포함되고 정렬됩니다.

이것은 계산 된 위치가 나머지 검색어에서 검색하는 값과 기본적으로 독립적이라는 것을 의미합니다. 그러나 더욱 혼란, 정렬 할 위치에 의한 경우 :

mysql> set @pos := 0; 
mysql> select @pos := @pos + 1 as pos, x from foo where x not in (2, 3) order by pos desc; 
+------+------+ 
| pos | x | 
+------+------+ 
| 4 | 5 | 
| 3 | 4 | 
| 2 | 1 | 
| 1 | 0 | 
+------+------+ 

x 값은 위치에 따라 분류되어 있습니다. 따라서 일치하는 레코드와 함께 위치 값을 붙이는 것은 무엇이든간에 ...

0

OK 솔루션을 찾았지만 기본적으로 2 개의 임시 테이블을 만들어 동일한 위치에 원하는 정확한 값을 얻은 다음 사용자에게 주어진 적절한 순위에 대해 SELECT를 실행했습니다. 다음은

코드 :

CREATE TEMPORARY TABLE IF NOT EXISTS `temp_rank_table` AS(
     SELECT p.`subscriber_id`, p.`total_points`, s.`account_type` 
     FROM `subscribers_points` p 
      LEFT JOIN `subscribers` s 
      ON s.`id` = p.`subscriber_id` 
     WHERE p.`year` = _year 
     AND p.`month` = _month 
     AND s.`account_type` BETWEEN 3 AND 8 
     AND `password_created` = 1 
     AND `verified` = 1 
     AND `active` = 1 
     ORDER BY p.`total_points` DESC 
    ); 

    SET @rank=0; 

    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_rank_table_count` AS(
     SELECT @rank:[email protected]+1 AS `rank`, `subscriber_id`, `total_points` 
     FROM `temp_rank_table` 
     ORDER BY `total_points` DESC 
    ); 

    # 

    SELECT t.`rank`, t.`subscriber_id`, t.`total_points` 
    FROM `temp_rank_table_count` t 
    WHERE `subscriber_id` = _subscriber_id; 

    DROP TABLE `temp_rank_table`; 
    DROP TABLE `temp_rank_table_count`; 
관련 문제