복붙노트

[SQL] 타이 T-SQL에 대한 MySQL의 대안

SQL

타이 T-SQL에 대한 MySQL의 대안

나는 정상의 N 기록을 취득하는 테이블이 있습니다. 기록은 값으로 정렬 및 일부 레코드는 같은 값을 가지고있다. 내가 여기서 뭘하고 싶은 것은 묶여 포함한 상위 N 기록의 목록을 얻을 수 있습니다. 이 표에 무엇이다 :

+-------+--------+
| Name  | Value  |
+-------+--------+
| A     | 10     |
| B     | 30     |
| C     | 40     |
| D     | 40     |
| E     | 20     |
| F     | 50     |
+-------+--------+

지금은과 같이 상위 3을 얻으려면

SELECT * FROM table ORDER BY Value DESC LIMIT 3

나는이 얻을 :

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
+-------+--------+

내가 좀하고 싶습니다 것은 이것이다

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
| B     | 30     |
+-------+--------+

나는 각 레코드의 순위를 계산 내가 정말 좋아하는 첫 번째 N 대신 기록 값으로 주문한 최초의 N의 기록을 위 얻을 수 있습니다 것이 무엇 때문에. 이것은 내가 순위를 계산하는 방법이다 :

SELECT Value AS Val, (SELECT COUNT(DISTINCT(Value))+1 FROM table WHERE Value > Val) as Rank

T-SQL에서 이런 일이 작업을 수행하여 달성 할 수있다 :

SELECT TOP 3 FROM table ORDER BY Value WITH TIES

사람이 어떻게 MySQL의에서이 작업을 수행하는 생각이 있습니까? 나는 그것이 하위 쿼리 또는 임시 테이블에 함께 할 수도 있지만이 작업을 수행 할 수있는 충분한 지식이없는 이해합니다. 나는 임시 테이블을 사용하지 않고 솔루션을 선호하는 것입니다.

해결법

  1. ==============================

    1.당신이 작동합니까?

    당신이 작동합니까?

    select Name, Value from table where Value in (
        select distinct Value from table order by Value desc limit 3
    ) order by Value desc
    

    아니면 :

    select a.Name, a.Value 
    from table a
    join (select distinct Value from table order by Value desc limit 3) b
         on a.Value = b.Value
    
  2. ==============================

    2.

    select a.Name, a.Value 
    from table a
    join (select Value from table order by Value desc limit 3) b
         on a.Value = b.Value
    

    이 Fosco의 대답 @ 비슷하지만 서브 쿼리에없는 DISTINCT. 그의 버전 수익률 상위 N 점수가 아닌 최고 N 플레이어 (플러스 관계) 가진 선수. 예를 들면 점수 인 경우 50, 50, 50, 40, 40, 30, 20, 그는 6 플레이어 (3 × 50, × 40, 1X30)을 반환합니다,하지만 당신은 아마도 단지 × 50을합니다.

  3. ==============================

    3.MySQL의 8을 시작으로, 당신은 RANK에 필터링하여, 넥타이 의미론을 에뮬레이트하는 윈도우 기능을 사용할 수 있습니다 (). 예를 들면 :

    MySQL의 8을 시작으로, 당신은 RANK에 필터링하여, 넥타이 의미론을 에뮬레이트하는 윈도우 기능을 사용할 수 있습니다 (). 예를 들면 :

    SELECT Name, Value
    FROM (
      SELECT Name, Value, RANK() OVER (ORDER BY Value DESC) AS rk
      FROM table
    ) t
    WHERE rk <= 3
    

    더 밀접하게 질문을 읽을 때, 이것은 당신이 원하는 것 정확히하지 않지만,이 T-SQL은 TOP을 통해 N TIES 절 함께 할 수 정확히 않습니다.

  4. from https://stackoverflow.com/questions/3469107/mysqls-alternative-to-t-sqls-with-ties by cc-by-sa and MIT license