2011-02-17 2 views
1
id|pnumber|special|limitedtime|normal 
1 |765234 |1  |0   |0 
2 |765235 |0  |1   |0 
3 |776234 |0  |0   |1 
4 |776235 |1  |0   |0 
5 |785456 |0  |1   |0 
6 |785457 |1  |0   |0 

이전에 게시 한 문제의 또 다른 시나리오가 있습니다.MySQL - PERL - 여러 열을 기준으로 정렬 한 다음 열로 정렬합니다. 부품 번호 필드

사실 저는 질문과 대답을 위해 dbi와 placeholder를 사용하고 있습니다.

대신 세 가지 질의 :

SELECT `pnumber` from `table` 
WHERE `special` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 

가 실행하고

SELECT `pnumber` from `table` 
WHERE `limitedtime` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 

실행 표시 및 표시

SELECT `pnumber` from `table` 
WHERE `normal` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 

실행 표시 내 결과를 제공하지만

, LIMIT는 3 가지/종속 변수 모두에 묶여 있어야합니다. 나는 제대로하는 경우에, 나에게 내가 원하는 순서대로 내 결과를 얻을 생각

SELECT `pnumber` from `table` 
ORDER BY special?? ABS(pnumber) DESC, 
ORDER BY limitedtime?? ABS(pnumber) DESC, 
ORDER BY normal?? ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 

:

그래서, 내가 좋아하는 일을하고 싶습니다.

765234 (special) 
776235 (special) 
785457 (special) 
765235 (limitedtime) 
785456 (limitedtime) 
776234 (normal) 

페이지 매기기/탐색에 LIMIT $ Lvar1, $ Lvar2를 사용합니다.

는 (다른 테이블 코드 아래로 나중에 진행에 질의/일부 상호 참조가 있기 때문에 테이블은 더 많은 데이터 결과는 실제로 배열로 추진되고있다.)

물론 큰 질문하는 사람이 월 대답은 간단한 여기에 나중에 가자!

모두에게 도움을 주셔서 감사합니다.

답변

1

당신은 쿼리의 출력을 결합하여 모든 조합을 사용할 수

SELECT `pnumber` from `table` 
WHERE `special` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 

UNION ALL 

SELECT `pnumber` from `table` 
WHERE `limitedtime` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar 

UNION ALL 

SELECT `pnumber` from `table` 
WHERE `normal` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar 

연합 (EU)은 모두 기본적으로 쿼리의 출력을 소요하고 그들을 연결합니다.

+0

나는 지금 시도하고 다시 연락 할 것입니다. 기대하고있어. 나는 UNION ALL에 대해 약간의 독서를 할 것입니다. 저를 가리켜 주셔서 감사합니다. 이것이 나를 위해 효과가 있다면 당신의 대답을 선택할 것입니다. – Stephie

+0

@Dodger는 중요한 문제를 지적하고 where 절은 1보다> 0을 가져야합니다. –

1

유니온 연산자를 사용하여 세 개의 선택을 결합한 다음 주문 및 제한을 수행 할 수 있습니다.

SELECT `pnumber` from `table` 
WHERE `special` > 1 
union 
SELECT `pnumber` from `table` 
WHERE `limitedtime` > 1 
union 
SELECT `pnumber` from `table` 
WHERE `normal` > 1 
ORDER BY ABS(pnumber) DESC 
LIMIT $Lvar1,$Lvar2 
+0

이제 그는 실행중인 3 개의 쿼리와 동일한 효과를 얻지 못합니다. pnumber로만 주문할 것이기 때문에 데이터가 표시되는 순서가 변경되며 포스터는 하위 범주별로 정렬 한 다음 pnumber로 정렬해야합니다. –

0

예제 데이터에 약간의 불일치가 있습니다. 당신은 값이 1보다 큰 특별한, 제한된 시간 또는 보통을 가진 것을 찾고 있습니다. 그러나 예제 데이터 세트의 값은 1뿐입니다. WHERE 절과 일치하는 것이 없으므로이 데이터 세트에서 어떤 결과도 얻지 못할 것입니다.

또한 DESC로 ORDER BY 절을 지정하지만 결과로보고 싶은 예제에서는 pnumber 오름차순으로 정렬하여 표시합니다.

나는 여기에 두 가정을 만들려고 해요 :

1) 값이> 0,하지를 어디에 당신은 실제로 원하는> 1 (만 0이 아닌 값을 필요로하는 경우, 쿼리가 있기 때문에 간단하게 얻을 수 있지만, 당신은 특별히 ABS()를 사용했습니다. 당신이 작업하고있는 실제 데이터가 음수 값을 가질 수 있다고 가정하고 있습니다.)

2) 실제로는 ASC를 의미하는 것이지 DESC가 아니라는 의미입니다. 요청한 출력이 그 순서에 있기 때문입니다. 그래서 위에서 지정한 데이터를 사용

다음 쿼리는 작동합니다

 
    SELECT pnumber, 
     CONCAT('(', 
       CONCAT_WS(', ', 
          IF(special > 0, 'special', NULL), 
          IF(limitedtime > 0, 'limited time', NULL), 
          IF(normal > 0, 'normal', NULL)), 
       ')') AS type_desc, 
     IF(special > 0, 3, 0) + IF(limitedtime > 0, 2, 0) + IF(normal > 0, 1, 0) AS disp_priority 
    FROM ex_table 
    WHERE ((special > 0) + (limitedtime > 0) + (normal > 0)) > 0 
ORDER BY disp_priority DESC, 
     ABS(pnumber) ASC 

없음 UNION 필요합니다. 또한 UNION은 사용자가 원하는 것을 제공하지 않을 수도 있습니다. 위의 UNION 예제 중 하나를 사용하면 special> 0 AND limitedtime> 0 인 경우 중복 출력 행을 얻을 수 있습니다. UNION-ed 쿼리 중 둘 이상과 일치하기 때문입니다. 그게 어떻게 당신이 물어 정확히 무엇을, 여분의 출력 열을 제외하고,

 
+---------+----------------+---------------+ 
| pnumber | type_desc  | disp_priority | 
+---------+----------------+---------------+ 
| 765234 | (special)  |    3 | 
| 776235 | (special)  |    3 | 
| 785457 | (special)  |    3 | 
| 765235 | (limited time) |    2 | 
| 785456 | (limited time) |    2 | 
| 776234 | (normal)  |    1 | 
+---------+----------------+---------------+ 
6 rows in set (0.23 sec) 

을 그리고 :

아래의 쿼리는 MySQL의 모니터에 다음을 출력합니다.

+0

오, LIMIT 절을 잊어 버렸습니다 ... 결국에는 그 점을 압니다. – Dodger

+0

아, BTW : 그 전체 CONCAT ... CONCAT_WS..AS type_desc 라인은 실제로 당신이 보여준 것처럼 괄호 안에 함께 결합 된 special/limited/normal을 출력합니다. DBI에서이 작업을 수행하기 때문에 선택 항목에 세 개의 열을 넣고 Perl의 진실성을 확인하여 무엇을 표시할지 결정할 수 있습니다. – Dodger

+0

좋아, 얘들 아. 나에게 뭔가를 설명 해줘. Stephie는 세 가지 별도의 쿼리를 사용하지 않을 쿼리를 요청했습니다. 세 가지 별도의 쿼리를 사용하지 않는 대답을 게시했습니다. 다른 두 명은 UNION을 사용하여 답변을 게시했습니다. MySQL의 작동 방식을 알고있는 사람이라면 누구나 UNION이 출력 전에 연결되어 있다는 것을 알 수 있습니다. 그래서 수수께끼를 내게 : 내 대답은 실제로 무엇을 무시하고 질문에 대답하고 두 가지 답변을하지 않는 투표? 현실은 민주주의의 변덕에 지배받지 않습니다. Stephie : 내 대답은 정확합니다. UNION 연산자는 여러 쿼리를 사용합니다. – Dodger

관련 문제