2009-12-14 2 views
1

확인 테이블에 style_number라는 열이 있습니다. style_number의 중복이있을 수 있습니다. 모든 것을 선택하고 싶지만 각 스타일 번호는 최대 3 개까지만 선택하고 싶습니다.MySql : 중복 열에 대한 제한 설정

예를 들어 style_number = "style 7"인 행이 4 개있는 경우 4 개 중 3 개만 선택됩니다 (어떤 3 개, 3 개든 상관 없음).

의미가 있습니까?

어떻게하면됩니까?

감사합니다.

참고 : 나는 맨 위] 4.1.22

편집을 사용하고 있습니다 : 일부 혼란을 취소합니다. 나는 다른 모든 컬럼도 필요로하고, "스타일 7"이상을 필요로하거나 쉽게 3으로 제한 할 수 있습니다. 예를 들면 다음과 같습니다. 여기 내 테이블 :

style_number | 가격 | 더 나은 이해가 그

"style 7" | 300 | 2 
"style 7" | 400 | 3 
"style 7" | 500 | 4 
"style 8" | 200| 1 
"style 8" | 300 | 2 

않습니다

"style 7" | 300 | 2 
"style 7" | 400 | 3 
"style 7" | 500 | 4 
"style 7" | 600 | 5 
"style 8" | 200| 1 
"style 8" | 300 | 2 

나는 결과로이를 얻을 것 stone_count?

+1

검색어를 그대로 표시 할 수 있습니까? 나는 where 절을보고 싶다. –

+0

style_number 값이나이 기준을 가진 테이블의 관련 열만 관심이 있습니까? –

답변

1

내가 MySQL의 개발자가 아니에요 WHERE 테이블에서 * TOP 3 SELECT, 그러나 나는 이것이 당신이 원하는 걸 줄 것이라고 생각합니다. 성능에 대한 약속 없음 :)

SELECT 
    T1.id, 
    T1.style_number, 
    T1.col1, 
    T1.col2, 
    ... 
FROM 
    My_Table T1 
WHERE 
    (
      SELECT 
       COUNT(*) 
      FROM 
       My_Table T2 
      WHERE 
       T2.style_number = T1.style_number AND 
       T2.id < T1.id 
    ) < 3 
+0

나는 이것이 내가 필요한 것에 지금까지 가장 가까운 것이라고 생각합니다. # 1235 -이 버전의 MySQL은 'LIMIT & IN/ALL/ANY/SOME 하위 쿼리'를 지원하지 않습니다. 서브 쿼리에서 LIMIT을 사용할 수 있다고 생각하지 않습니다. –

+0

방금 ​​편집 한 후 다른 해결책을 넣었습니다. MySQL에서 잘 작동 할 것입니다 (SQL Server에서 작동하며 ANSI 규격이라고 생각합니다). 다시 말하지만, 성과에 대한 어떤 약속도 할 수 없습니다. –

+0

완벽한! 나는 논리를 정말로 이해하지 못한다. 그러나 그것은 효과가있다! –

0
SELECT * FROM yourTable WHERE style_number = "style 7" LIMIT 3 

이렇게하면 결과 집합이 최대 3 행 중 데이터베이스 엔진이 먼저 찾는 행까지 제한됩니다. 어떤 속성에서 상위 3을 원하면 앞에 ORDER BY colName을 추가 할 수 있습니다.

+0

그러나 이것은 스타일 7 만 반환 할 것이고, 나는 모든 다른 스타일을 원하지만 각각 최대 3 개가 필요합니다. –

+0

아, 알겠습니다. 나는 원래의 질문에서 그것을 얻지 못했습니다. 미안하다. –

0

LIMIT 구문 here을 살펴보십시오.

0

TOP 절을 사용하면 반환 할 행 수를 지정할 수 있습니다.

예를 들어 : style_number = "스타일 7"

http://www.w3schools.com/sql/sql_top.asp

+1

mysql에는 TOP 3이 없다. 그것 대신에'LIMIT'을 사용하십시오. –

0

귀하의 MySQL 버전으로 인해 옵션이 상당히 제한 될 수 있습니다. 단일 쿼리에서이 작업을 수행하는 것이 불가능할 수 있으므로 대체 방법을 제공 할 것이라고 생각했습니다.

간단한 솔루션은 각 스타일을 반복하고 LIMIT 3 매개 변수로 스타일을 쿼리하는 것이지만 많은 쿼리를 실행해야합니다. 그런 다음

SELECT DISTINCT style_number FROM styles; 

당신이 다음 읽기 수 있도록 다음과 같이 프로그래밍 언어로 SQL 문자열을 구축하기 위해 style_numbers을 반복 할 수 있습니다 :

를 단일 쿼리로 이러한 결합하려면, 먼저 모든 스타일의 목록을
SELECT * FROM styles WHERE style_number = 'style 7' LIMIT 3 
UNION 
SELECT * FROM styles WHERE style_number = 'style 8' LIMIT 3 
UNION 
... 

희망이 도움이됩니다.