2012-04-24 2 views
2

테이블이 baskets, fruitsbasket_fruits (조인 테이블 : basket_id-fruit_id)입니다. 내가위치와 결합

+---------------------------------------+ 
| basket_id | fruit_id | fruit_position | 
|---------------------------------------| 
| 1   | 2  | 1    | 
| 1   | 5  | 2    | 
+---------------------------------------+ 

과일 위치 같은 것을 얻을 수 있도록

어떻게 반환 조인 된 테이블의 행의 단지 수 (가 열 수 없음)입니다 바구니에 각 과일의 위치를 ​​반환 할 수 있습니다.

Schema: 
baskets:  id, title 
fruits:  id, title 
basket_fruits: id, basket_id, fruit_id 
+0

는 스키마를 게재 할 수 있습니까? – Starx

답변

5

MySQL는 하위 쿼리 사용해야합니다 있도록 기능까지 지원하지 않습니다

SELECT basket_id, fruit_id, 
     (
     SELECT COUNT(*) 
     FROM basket_fruit bfi 
     WHERE bfi.basket_id = bf.basket_id 
       AND bfi.fruit_id <= bf.fruit_id 
     ) AS fruit_position 
FROM basket_fruit bf 
WHERE basket_id = 1 

또는 세션 변수를 사용 (빠르지 만 설명하지 않은 구현 세부 사항에 의존 이후 릴리스에서 중단 될 수 있습니다) :

SET @rn = 0; 

SELECT basket_id, fruit_id, @rn := @rn + 1 AS fruit_position 
FROM basket_fruit bf 
WHERE basket_id = 1 
ORDER BY 
     fruit_id 
1

SQL은 리턴 된 행의 순서를 보장하지 않습니다. 따라서 fruit_position은 때때로 쿼리 할 때 다를 수 있습니다. 대부분 테이블에있는 DML 활동으로 인해 발생합니다. 당신이 정말로 어떤 주문을해야하는 경우

, 당신이 선택해야합니다 :

  1. 를 사용하여 기존의 열 (있는 경우)
  2. 가 주문을 지정 것이다 seq_nr와 같은 특정 필드 만들기 과일 이름처럼 키를 주문으로 너의 과일.
2

basket_fruits 테이블에는 가중치로 간주되는 열이 표시되지 않습니다.

SET @current_group = NULL; 
SET @current_count = NULL; 

SELECT 
id, basket_id, fruit_id, 
CASE 
    WHEN @current_group = basket_id THEN @current_count := @current_count + 1 
    WHEN @current_group := basket_id THEN @current_count := 1 
END AS fruit_position 
FROM basket_fruits 
ORDER BY basket_id, id 

샘플 입력 :

+----+-----------+----------+ 
| id | basket_id | fruit_id | 
+----+-----------+----------+ 
| 2 |   2 |  5 | 
| 6 |   2 |  1 | 
| 9 |   1 |  2 | 
| 15 |   2 |  3 | 
| 17 |   1 |  5 | 
+----+-----------+----------+ 
당신은 단순히 해당 테이블의 데이터에 몇 가지 숫자를 추가 할 경우 (이 각 바구니가 자신의 무게 1 계산을 할 수 있습니다)이 시도해 볼 수도 있습니다

샘플 출력 :

+----+-----------+----------+----------------+ 
| id | basket_id | fruit_id | fruit_position | 
+----+-----------+----------+----------------+ 
| 9 |   1 |  2 |    1 | 
| 17 |   1 |  5 |    2 | 
| 2 |   2 |  5 |    1 | 
| 6 |   2 |  1 |    2 | 
| 15 |   2 |  3 |    3 | 
+----+-----------+----------+----------------+ 
+0

제목을 쓰는 동안 무게에 대해 생각하고 있었지만, 그 다음 잊어 버렸습니다. 답장을 주셔서 감사합니다. 그것을 시도해보기 – fl00r