2015-02-06 85 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'); 

關係:表與表商品項之間的關係。某些類型爲"usual"的物品與類型爲"digital"的物品有關。並非所有項目都鏈接。

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); 

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

我需要使用表關係由'wares'.'sortnum'主要排序從表中選擇數據商品。如果類型爲"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

能否請您具體談談你的問題?你寫的「工作不好」。它以什麼方式效果不佳? – 2015-02-06 14:57:43

+0

在我錯誤的查詢數據按**「itemtype」**排序。但我需要主要訂購是**「sortnum」**。如果當前具有「常規」類型的項目與「數字」項目有關係,則該數字項目在結果中遵循該「常規」。 – 2015-02-06 15:09:59

回答

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 | 

其實,進一步看起來有點我覺得你可以查詢更改爲:

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

謝謝!第二個版本太棒了! – 2015-02-09 07:50:11

相關問題