2015-02-06 3 views
2

내 질문은 previous과 매우 유사합니다. 하지만 하나의 조건을 추가하십시오.
나는 2 개의 테이블을 가지고 있습니다.
상품 : : 제품 정보. 항목에는 "평소"또는 "디지털"유형이 있습니다. 열 "sortnum"기본 결과 정렬을 의미합니다.다른 테이블의 관계를 사용하여 테이블에서 열에서 mysql 순서 데이터

id | name | itemtype 

CREATE TABLE IF NOT EXISTS `wares` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `sortnum` int(11) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `itemtype` enum('usual','digital') NOT NULL DEFAULT 'usual', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `wares` (`id`, `sortnum`, `name`, `itemtype`) VALUES 
(1, 8, 'ware1', 'usual'), 
(2, 7, 'ware2', 'usual'), 
(3, 4, 'ware3', 'usual'), 
(4, 11, 'ware4', 'usual'), 
(5, 21, 'ware5', 'usual'), 
(6, 22, 'ware6', 'digital'), 
(7, 2, 'ware7', 'usual'), 
(8, 33, 'ware8', 'digital'), 
(9, 15, 'ware9', 'usual'), 
(10, 19, 'ware10', 'digital'); 

관계 : 테이블 테이블 상품에서 항목 사이의 관계와. 종류가 인 일부 항목은 "digital" 유형의 항목과 관련이 있습니다. 모든 항목이 링크되어있는 것은 아닙니다.

나는 테이블을 관계 'wares'.'sortnum'에 의해 차 주문을 사용하여 테이블에서 상품 데이터를 선택해야

http://sqlfiddle.com/#!2/e069f0/1

id_usualware | id_digitalware 

CREATE TABLE IF NOT EXISTS `relations` (
    `id_usualware` int(11) NOT NULL, 
    `id_digitalware` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `relations` (`id_usualware`, `id_digitalware`) VALUES 
(1, 6), 
(4, 8), 
(7, 10); 
. "usual" 유형의 항목이 "digital" 항목과 관련성이있는 경우이 디지털 항목은 결과로 "usual"을 따릅니다.

id | sortnum | name | itemtype 
7 | 2 | ware7 | 'usual' 
10| 19 | ware10| 'digital' 
3 | 4 | ware3 | 'usual' 
2 | 7 | ware2 | 'usual' 
1 | 8 | ware1 | 'usual' 
6 | 22 | ware6 | 'digital' 
4 | 11 | ware4 | 'usual' 
8 | 33 | ware8 | 'digital' 
9 | 15 | ware9 | 'usual' 
5 | 21 | ware5 | 'usual' 

쿼리의 나의 버전은 잘 작동하지 않습니다

SELECT w2.*, r.* 
FROM wares w 
    LEFT JOIN relations r ON r.id_digitalware = w.id 
    LEFT JOIN wares w2 ON w2.id = COALESCE(r.id_digitalware, w.id) 
WHERE w2.sortnum >0 
ORDER BY 
    CASE WHEN (r.id_usualware IS NULL) THEN w2.sortnum END ASC , 
    CASE WHEN (r.id_usualware IS NOT NULL) THEN r.id_usualware END DESC 

는, MySQL의 쿼리 도와주세요.

+0

당신은 당신의 질문에 대한 구체적시겠습니까? 당신은 "잘 작동하지 않는다"라고 썼다. 어떤면에서 제대로 작동하지 않습니까? –

+0

잘못된 쿼리 데이터에서 ** "itemtype"**으로 주문하십시오. 하지만 기본 주문은 ** "sortnum"**이 필요했습니다. "보통"유형의 현재 항목이 "디지털"항목과 관련이있는 경우이 디지털 항목은 결과에서이 "보통"을 따릅니다. –

답변

2

나는이 같은 sortnum 사용하는 일종의 또 다른 왼쪽 조인을 추가하고 변경하여이 문제를 해결 할 수 있다고 생각 : 당신이 바이올린이 출력됩니다에서 제공하는 샘플 데이터로

select w2.* 
from wares w 
left join relations r on r.id_digitalware = w.id 
left join wares w2 on w2.id = coalesce(r.id_digitalware, w.id) 
left join wares w3 on r.id_usualware = w3.id 
order by coalesce(w3.sortnum, w.sortnum), (w.itemtype = 'usual') desc; 

Sample SQL Fiddle

:

:

| ID | SORTNUM | NAME | ITEMTYPE | 
|----|---------|--------|----------| 
| 7 |  2 | ware7 | usual | 
| 10 |  9 | ware10 | digital | 
| 3 |  4 | ware3 | usual | 
| 2 |  7 | ware2 | usual | 
| 1 |  8 | ware1 | usual | 
| 6 |  10 | ware6 | digital | 
| 4 |  11 | ware4 | usual | 
| 8 |  6 | ware8 | digital | 
| 9 |  15 | ware9 | usual | 
| 5 |  21 | ware5 | usual | 

사실, 조금 더보고 난 당신에 대한 쿼리를 변경할 수 있다고 생각 6,

select w.* 
from wares w 
left join relations r on r.id_digitalware = w.id 
left join wares w2 on r.id_usualware = w2.id 
order by coalesce(w2.sortnum, w.sortnum), (w.itemtype = 'usual') desc; 

Sample SQL Fiddle for second version.

+0

감사! 두 번째 버전은 훌륭합니다! –

관련 문제