주문

2017-10-23 5 views
2

나는 4에 의한 견해로 내 데이터베이스 순서에서 * 선택 쿼리 제한이 있습니다 주문

SELECT * FROM articles WHERE visible = 1 ORDER BY views LIMIT 4; 

그러나

가 동일한 쿼리에 나는 다른 모든 행을 찾으려면을 열을 기준으로 주문 함.

이 같은 일을 tryied,하지만 일을하지 비하 :

(SELECT * FROM articles ORDER BY views DESC LIMIT 4) 
UNION 
(SELECT * FROM articles ORDER BY updated_at DESC); 

는이 "고정"4 개 hotest 홈 페이지에 기사 다음 시간에 주문이 업데이트되었다된다 제안한다.

행을 반복하지 않고 동일한 쿼리에서 여러 가지 방법으로 ORDER BY 방법을 사용할 수 있습니까?

어떻게하면됩니까?

+0

목록에서 가장 인기있는 4 번째를 원하십니까? 홈페이지에 몇 개의 기사가 표시됩니까? 맞는 것보다 많은 기사가 있다면, 몇 개나됩니까? (좀 더 정확하게 질문을 편집하십시오. 그렇다면 팀의 답변보다 더 나은 답변을 제공 할 수 있습니다.) –

답변

-1

는 :

... UNION의 기본 동작은 중복 행이 결과에서 제거하는 것입니다. ORDER BY는 SELECT에 LIMIT없이 나타나는 경우 어쨌든 아무런 효과가 없기 때문에 ...

그리고

는 ..., 그것은 멀리 최적화되어 있습니다.

(SELECT * FROM articles WHERE visible = 1 ORDER BY views DESC LIMIT 4) 
UNION 
(SELECT * FROM articles WHERE visible = 1 ORDER BY updated_at DESC LIMIT 100); 

쿼리는 MySQL을 5.6과 5.7에서 테스트되었습니다 : ...

그래서 여기에 트릭은 (는 제한을 선택하는 당신에게 달려있다) 두 번째 쿼리에 limit을 사용하는 것입니다.

+0

이것은 정말 완벽하게 작동했습니다! 통찰력을 주셔서 감사합니다, 내가 문제를 해결하는 데 도움이! – char4

+0

이 쿼리의 문제는 순서가 없다는 것입니다. 처음 네 개의 가장 큰 뷰가 결과 집합의 첫 번째로 나타날 것이라는 보장은 없습니다. –

+0

@TimBiegeleisen 귀하의 진술에 대한 더 많은 증거를 제공해주십시오. – zstate

0

쉼표를 사용하여 여러 개의 ORDER 명령을 구분할 수 있습니다. MySQL은 왼쪽에서 오른쪽 순으로 정렬됩니다.

SELECT * FROM articles WHERE visible = 1 ORDER BY views, updated_at DESC LIMIT 4;

+0

하지만 결과는 4로 제한되지 않습니까? 'views'에 의해 가장 유력한 기사 4 개를 찾은 다음'updated_at'에 의해 나머지 모든 행을 찾으려고합니다. – char4

2

현재의 사고를 계속, 우리는 두 개의 하위 쿼리의 조합이 걸릴 수 있습니다. 첫 번째 하위 쿼리는 이미 질문에 포함되어 있으며 자주 본 4 개의 기사를 찾습니다. 두 번째 하위 쿼리는 다른 모든 항목을 찾습니다. 트릭은 각 하위 쿼리에 상위 4 개 레코드를 추적하는 데 사용할 수있는 계산 된 필드를 포함시키는 것입니다. 그런 다음이 계산 된 필드를 먼저 지정하고 두 번째 다음에 updated_at 필드를 정렬합니다. MySQL의 documentation에서

(
    SELECT a.*, 1 AS label 
    FROM articles a 
    WHERE visible = 1 
    ORDER BY views DESC 
    LIMIT 4 
) 
UNION ALL 
(
    SELECT a.*, 2 
    FROM articles a 
    WHERE visible = 1 
    ORDER BY views DESC 
    LIMIT 1000000 OFFSET 4 -- the limit 1000000 is arbitrary; just use a number 
)        -- larger than the expected size of your table 
ORDER BY 
    label, views, updated_at 
+0

@ CHAR4가 "가장 섹시한"기사를 원하기 때문에'ORDER BY views DESC' 여야합니다 .. –

+0

@RaymondNijland 맞습니다 ... OP에서 검색어를 실수없이 복사하는 댓가로 지불하는 가격입니다. –

+0

@TimBiegeleisen 감사합니다. 당신은 저를 많이 돕고 있습니다. OFFSET 전에 쉼표를 제거하고 쿼리를 실행하려고했습니다. 이제 구문 오류가 생겼습니다 :'(...) '1 AS 레이블 근처에서 사용할 문법 where visible = 1 ORDER BY views DESC at line 2' – char4