2011-10-24 1 views
3
MySQL의 쿼리에서 표현하는 방법

를 얻을.MySQL은 "모든 새로운 요소를 얻을 수 있지만, 적어도 N 요소"적어도 N 요소

내가 더 잘 설명하려고합니다. 나는 제품 목록 (product, price, date, new)을 가지고 있고 사용자에게 모든 새로운 요소를 보여주고 싶다면 질의를하는 법을 알고 싶다. 그러나 N 요소보다 적다면 (예 : 5) 또한 마지막 항목. 같은 쿼리에서 생각할 수있는 경우 :

SELECT * FROM `products` WHERE new='1' ORDER BY date DESC 

그러나 이것은 단지 모든 새로운 요소와이 반환

SELECT * FROM `products` WHERE new='0' ORDER BY date DESC LIMIT 5 

그냥 필요한 최소한의 요소를 반환합니다.

몇 가지 예 : 테이블에 4 개의 새로운 항목이 포함 된 경우 테이블이 7 개의 새로운 항목이 포함되어있는 경우

  • , 쿼리가 4 개 개의 새로운 아이템과 최신이 아닌 새로운 항목
  • 를 반환해야합니다 쿼리가 반환해야 단지 7 개 새로운 아이템
  • 표 1 새 항목이 포함되어있는 경우, 쿼리는 새 항목 4가 아닌 새 항목을 반환해야합니다.
+0

가 어떻게'new' 필드는'date' 분야에서 차별화는 무엇입니까? 날짜별로 주문한 결과를 5로 제한하면 어쨌든 찾고 있던 결과를 얻을 수 있습니까? 결과의 다섯 번째 요소가 "새로운"것이 아닐지라도, 여전히 최신 아닌 새 항목이 될 수 있습니까? –

+1

LIMIT 쿼리에서는 불가능합니다. 한계 값은 상수 또는 변수 여야하며 쿼리가 실행될 때 동적으로 한도를 채울 수 없습니다. 클라이언트 측 마사지를해야합니다. –

+1

@logan : 표시 할 새 항목/이전 항목이 7 개라도 5 개 항목 만 반환합니다. –

답변

4

사용 UNION은 두 개의 결과 집합을 결합합니다.

(
    SELECT * 
    FROM `products` 
    WHERE new = '1' 
) 
UNION 
(
    SELECT * 
    FROM `products` 
    ORDER BY new DESC, date DESC 
    LIMIT 5 
) T1 
ORDER BY new DESC, date DESC 
  • 연합의 첫 번째 부분은 모든 새로운 항목을 반환합니다.
  • 연합의 두 번째 부분은 처음 다섯 개 개의 새로운 아이템을 반환하거나 미만 5 개 항목, 모든 새로운 항목과 먼저 5-N 오래된 항목이있는 경우.
  • UNION은 결과 집합의 모든 중복을 제거합니다.

참고이 테이블의 컬럼의 열 또는 조합에 정의 된 고유 키가 있다고 가정합니다 (테이블에 기본 키가있는 경우, 예를 들어,이 작동합니다). 추가 항목 1) 모든 새로운 항목과 2) 최소 :

+1

이것은 내가 처음에 생각한 것입니다. 그러나 표시 할 새 항목이 5 개 이상이라도 5 개로 제한됩니다. – Genzume

+1

문제는 새로운 결과가 있더라도 5 개의 이전 결과를 출력한다는 것입니다. – Karolis

+0

@ Karolis : 아니오. * 최대 5 * 이전 행만 출력합니다. 5 개 이상의 새로운 행이있는 경우 * no * 이전 행이 반환됩니다. –

0

은 당신이 할 수있는 최선의 두 가지 선택의 UNION 생각합니다. 그런 다음 표시 할 행을 응용 프로그램 논리에 결정하십시오. SQL은 당신이 원하는 것을하기위한 문법을 ​​제공하지 않습니다.

편집 : 사실, 아마도 사용자 정의 변수를 사용하여이를 수행 할 수 있습니다. MySQL 서버의 경우에는 UNION을 수행하는 것이 더 적은 작업 일 수 있습니다. new로도

1

주문뿐만 아니라, date

SELECT * FROM `products` ORDER BY new, date DESC 
+1

+1 우리는 똑같은 생각을했습니다. 그러나 한계를 잊지 마세요. – Marvo

+0

@Marvo why limit? 그것은 모든 새로운 요소를 말하지만 5 개 이상의 요소를 말합니다. 이 쿼리는 두 가지 요구 사항을 모두 충족합니다. –

0
SELECT *, @rownum := @rownum + 1 AS rownum 
FROM products, (SELECT @rownum := 0) AS vars 
ORDER BY new DESC, date DESC 
HAVING rownum <= 5 OR new = 1 
+0

나는 이것을 시도했지만, 5 개 미만의 항목이있을 때 5 개 항목을 반환 할 수 없다. – Ivan

+0

NULL 값도 원합니까? –

0

select * from products order by new desc, date desc limit 5

이 "새로운"열이 만에 1 또는 0의 값을 갖는 것으로 가정합니다.

+1

하지만 7 개의 새 항목이 있으면 5 개만 반환됩니다! :) – Ivan

0

의사 코드 :

CREATE STOREPROCEDURO 
(
    @howMany INT 
) 

Declare @nNew INT 

Declare @nOld INT 

SET @nNew = (select count(*) from table where new = 1 order by date desc) 

set @nOld = (select count(*) from table where old = 1 order by date desc) 

set @nOld = @howMany - @nNew 

if (@nOld < 0) 
begin 
    @nOld = 0 
end 

(select top (@nNew) * from table where new = 1 order by date desc) 
union 
(select top (@nOld) * from table where new = 0 order by date desc) 
</code> 
관련 문제