2012-11-02 35 views
1

下面是一個查詢我的工作:MySQL的排序多個列不工作

SELECT i.*, 
CASE WHEN i.modified = 0 THEN i.created ELSE i.modified END as lastChanged, c.name as categoryname,c.id as categoryid, c.alias as categoryalias, c.params as categoryparams 
FROM mc23r_k2_items as i 
LEFT JOIN mc23r_k2_categories AS c 
ON c.id = i.catid 
WHERE i.published = 1 
AND c.id IN (1,2,3,4) 
ORDER BY c.ordering, i.ordering 
LIMIT 0, 100 

我要加入完整的新手和先進的東西。 上述查詢的結果如下返回CATID:

c.ordering: 2 1 2 1 2 1 2 2 2 3 3 3 4 4 4 4 4 
i.ordering: 1 1 2 2 3 3 4 5 6 1 2 3 1 2 3 4 5 

我找順序

c.ordering: 1 1 1 2 2 2 2 2 2 3 3 3 4 4 4 4 4 
i.ordering: 1 2 3 1 2 3 4 5 6 1 2 3 1 2 3 4 5 

我應該做的查詢什麼變化吧。只有c.ordering第1列和第2列的衝突點是休息模式是好的。

據我所知c.ordering應先責令爲什麼列1和2亂蓬蓬?

**mc23r_k2_items**
id INT(11)
title VARCHAR(255)
alias VARCHAR(255)
catid INT(11)
published SMALLINT(6)
introtext MEDIUMTEXT
fulltext MEDIUMTEXT
video TEXT
gallery VARCHAR(255)
extra_fields TEXT
extra_fields_search TEXT
created DATETIME
created_by INT(11)
created_by_alias VARCHAR(255)
checked_out INT(10)
checked_out_time DATETIME
modified DATETIME
modified_by INT(11)
publish_up DATETIME
publish_down DATETIME
trash SMALLINT(6)
access INT(11)
ordering INT(11)
featured SMALLINT(6)
featured_ordering INT(11)
image_caption TEXT
image_credits VARCHAR(255)
video_caption TEXT
video_credits VARCHAR(255)
hits INT(10)

**mc23r_k2_categories**
id INT(11)
name VARCHAR(255)
alias VARCHAR(255)
description TEXT
parent INT(11)
extraFieldsGroup INT(11)
published SMALLINT(6)
access INT(11)
ordering INT(11)
image VARCHAR(255)
params TEXT
trash SMALLINT(6)
plugins TEXT
language CHAR(7)


這裏是我的問題的簡化版本,感謝大家的時間。請執行下列SQL代碼片段

CREATE DATABASE `test1` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; 
USE `test1`; 

CREATE TABLE IF NOT EXISTS `mc23r_k2_categories` ( 
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `ordering` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `ordering` (`ordering`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ; 



INSERT INTO `mc23r_k2_categories` (`id`, `ordering`) VALUES 
(1, 1), 
(2, 1), 
(3, 2), 
(4, 3), 
(5, 2), 
(6, 1), 
(7, 2), 
(8, 3), 
(9, 4), 
(10, 1), 
(11, 2), 
(12, 3), 
(13, 4), 
(14, 5), 
(15, 6); 

CREATE TABLE IF NOT EXISTS `mc23r_k2_items` ( 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `catid` int(11) NOT NULL, 
    `ordering` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `catid` (`catid`), 
    KEY `ordering` (`ordering`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=58 ; 



INSERT INTO `mc23r_k2_items` (`id`, `catid`, `ordering`) VALUES 
(1, 2, 1), 
(2, 2, 2), 
(3, 2, 3), 
(4, 2, 4), 
(5, 2, 5), 
(6, 2, 6), 
(7, 3, 1), 
(8, 3, 2), 
(9, 3, 3), 
(10, 3, 4), 
(11, 4, 1), 
(12, 4, 2), 
(13, 4, 4), 
(14, 4, 3), 
(15, 4, 5), 
(16, 1, 2), 
(17, 1, 3), 
(18, 1, 1); 

模擬我的問題,請運行下面的查詢

SELECT catid 
    FROM mc23r_k2_items as i 
    LEFT JOIN mc23r_k2_categories AS c 
    ON c.id = i.catid 
    WHERE c.id IN (1,2,3,4) 
    ORDER BY c.ordering, i.ordering 
    LIMIT 0, 100 

結果集不是由CATID下令

+0

它應該做你的期望。你確定它沒有這樣做?嘗試添加'c.ordering'到'SELECT'列表來檢查。 – Barmar

+0

我在這幾個小時現在,首要任務應該是'c.ordering'但似乎並沒有工作兩個排序列'int' – user1793325

+1

我不認爲做它的相關的問題,但爲什麼這一個LEFT加入而不是INNER JOIN? 'WHERE i.published = 1'子句意味着您將永遠不會在類別表中返回沒有匹配的行。 – Barmar

回答

0

的查詢實際上正在做它的意圖。問題是與c.ordering值,其中在我的項目父類具有相同的排序值(1)和它的第一個子類具有相同的排序值(1)
謝謝大家對您的寶貴時間@nawfal。