2013-10-24 1 views
0

는 다음과 같은 구조를 가진 테이블라는 이름의 책을 갖는 선택MySQL은 서수

╔════════════╦═══════════╦════════╗ 
║ LibraryId ║ BookId ║ Price ║ 
╠════════════╬═══════════╬════════╣ 
║ 123  ║ 9001  ║ 10.99 ║ 
║ 123  ║ 9005  ║ 12.99 ║ 
║ 123  ║ 9006  ║ 7.99 ║ 
║ 124  ║ 8012  ║ 6.49 ║ 
║ 124  ║ 9001  ║ 3.19 ║ 
║ 124  ║ 9076  ║ 7.39 ║ 
╚════════════╩═══════════╩════════╝ 

나는 전체 테이블을 반환하는 선택을 할 수있는 방법을하지만, 추가로, 서수라는 이름의 그 필드 "계산"수 도서관 당 도서 수

╔════════════╦═══════════╦════════╦════════╗ 
║ LibraryId ║ BookId ║ Price ║Ordinal ║ 
╠════════════╬═══════════╬════════╬════════╣ 
║ 123  ║ 9001  ║ 10.99 ║  1 ║ 
║ 123  ║ 9005  ║ 12.99 ║  2 ║ 
║ 123  ║ 9006  ║ 7.99 ║  3 ║ 
║ 124  ║ 8012  ║ 6.49 ║  1 ║ 
║ 124  ║ 9001  ║ 3.19 ║  2 ║ 
║ 124  ║ 9076  ║ 7.39 ║  3 ║ 
╚════════════╩═══════════╩════════╝════════╝ 

내가 좋아하는 뭔가를 시도 :

SET @var_record = 1; 
SELECT *, (@var_record := @var_record + 1) AS Ordinal 
FROM books; 

을하지만이 관계없이 libraryId의 카운트 계속 결과는 무엇인가처럼 보일 것입니다. 도서관이 바뀔 때마다 서수를 재설정 할 무언가가 필요합니다. 절차 대신 단일 쿼리를 선호합니다.


테스트 데이터는 SQL 스크립트 :

create temporary table books(libraryId int, bookId int, price double(4,2)); 
insert into books (libraryId, bookId, price) values (123, 9001, 10.99),(123, 9005, 10.99),(123, 9006, 10.99),(124, 8001, 10.99),(124, 9001, 10.99),(124, 9076, 10.99); 
+0

집계 된 함수 USE 집계 된 함수 – progrAmmar

답변

1

(libraryId가 변경) . 열 라이브러리에 의해 주문해야합니다.

두 번째 if 문은 두 개의 할당을 함께 그룹화하고 @var_record를 반환하는 데 사용됩니다.

if(@var_record := 1 and @libId := libraryId, @var_record, @var_record) 
+1

이러한 MySQL 솔루션을 볼 때마다 실제보기 기능을 가진 데이터베이스를 사용할 수없는 모든 사람들을 위해 눈물을 흘 렸습니다. – user2864740

+0

아키텍처 부서에서 검은 색 마법과 같은 저장 프로 시저를 두려워하면 어떻게 될지 ... –

+1

A SP wouldn 이 경우에 근본적인 질문을하는 데 도움이되지 않습니다 - 그것은 동등하거나 무언가 철저한 절차 적 것입니다. 문제는 MySQL이 그런 표현을 깔끔하게 표현할 능력이 없다는 것입니다. 그런 제한을 "받아 들여야"하는 것은 내게 조금 슬픈 일입니다. – user2864740

-3

아마도 당신이 사용할 수있는 통합 된 기능 변수 및 조건에 따라 카운터를 재설정 할 수 있습니다 조건을 사용하여

SELECT a.LibraryId, a.BookId, a.Price, 
     (SELECT COUNT(b.BookId) FROM books b WHERE b.BookId = a.BookId AND b.LibraryId = a.LibraryId) AS Ordinal 
FROM a.books 
+2

이 함수는 모든 "서수"에 대해 1,1,1,1,1을 반환합니다. 비록 그것이 LibraryId에 의해서만 그룹 일지라도 그것은 3, 3을 반환 할 것이고 내가 요구 한 것이 아닙니다. 문제가 끝났다고 생각하고 신속하게 답변하지 않으므로 가장 먼저 게시하십시오. –

+0

내 잘못, 거기에 필요한 하위 쿼리가있을 것입니다. 내 대답을 바꾸게 해줘. – progrAmmar

+0

여전히 수정되지 않습니다. 그것은 libraryId와 bookId별로 그룹화 된 것으로 간주합니다. 즉, 예제의 데이터에서 1,1,1,1,1,1을 서수로 반환합니다. –