2011-06-20 75 views
0

我正在構建一個用於踢腿的bug跟蹤器類型工具。 我有一個與我的數據版本控制有關的小概率的probs。Mysql - 從表B引用時需要獲取最新的表A

我有一個表'行動',我存儲有關行動(描述,誰進入它,狀態等)的所有數據。我也有一個action_status表,每次狀態改變時(從未分配,正在進行,完成等),它被記錄在這裏.. 我似乎無法做的是列出與他們的最新狀態值的行動。 你會注意到,狀態表有兩行,一個已經提交,otehr沒有..我只想看到已經提交的行= 0(我認爲最近的日期..)

使情況變得更糟,每個動作都有一個修訂標識,如果動作文本已更改,我將在動作表中使用相同標識創建一個新條目,但是會有一個新的修訂標識。但我認爲我應該提及以防萬一它干擾我的問題。

這裏是我的表格和一些示例數據: 我是一隻猴子嗎?

 
CREATE TABLE IF NOT EXISTS `action` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_action` int(11) NOT NULL, 
    `id_priority` int(11) NOT NULL, 
    `revision` int(11) NOT NULL DEFAULT '1', 
    `reference` varchar(255) NOT NULL, 
    `department` int(11) NOT NULL, 
    `id_parent` int(11) NOT NULL DEFAULT '0', 
    `sort_order` int(11) NOT NULL, 
    `description` text NOT NULL, 
    `date_start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `date_end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `date_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 

-- 
-- Dumping data for table `action` 
-- 

INSERT INTO `action` (`id`, `id_action`, `id_priority`, `revision`, `reference`, `department`, `id_parent`, `sort_order`, `description`, `date_start`, `date_end`, `date_created`) VALUES 
(1, 1, 1, 1, '1', 1, 0, 2, 'Test Action revision test 1 a', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2011-06-17 00:00:00'), 
(2, 1, 1, 2, '0', 1, 0, 2, 'Test Action revision test 1 b', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2011-06-17 00:00:00'), 
(3, 2, 1, 1, '0', 1, 0, 1, 'Test Action revision test 2 a', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2011-06-17 00:00:00'), 
(4, 2, 1, 2, '0', 1, 0, 1, 'Test Action revision test 2 b', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2011-06-17 00:00:00'), 
(5, 3, 2, 1, '0', 1, 0, 0, 'Test Action revision test 3 b', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '2011-06-17 00:00:00'); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `action_status` 
-- 

CREATE TABLE IF NOT EXISTS `action_status` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_department` int(11) NOT NULL, 
    `id_priority` int(11) NOT NULL, 
    `id_action` int(11) NOT NULL, 
    `status` int(11) NOT NULL, 
    `submitted` tinyint(4) NOT NULL, 
    `approved` tinyint(4) NOT NULL, 
    `published` tinyint(4) NOT NULL, 
    `date_now` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `action_status` 
-- 

INSERT INTO `action_status` (`id`, `id_department`, `id_priority`, `id_action`, `status`, `submitted`, `approved`, `published`, `date_now`) VALUES 
(1, 1, 1, 2, 3, 1, 1, 1, '2011-06-20 16:36:09'), 
(2, 1, 1, 2, 5, 0, 0, 0, '2011-06-20 16:40:09'); 


CREATE TABLE IF NOT EXISTS `priority` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `priority` 
-- 

INSERT INTO `priority` (`id`, `description`) VALUES 
(1, 'Test Priority'), 
(2, '2nd Priority'); 

而我的「問題」 SQL

 
SELECT `action`.`id_priority`, `priority`.`description` as priority, `action`.`reference`, `action`.`description` as action, `action`.`id_action`, `action`.`date_start`, `action`.`date_end`, `action`.`id_parent`, `action_status`.`status`, `action`.`revision`, `action_status`.`submitted`, `action_status`.`date_now` 

FROM (`action`) 

LEFT JOIN action_status ON 
    `action_status`.`id_action` = `action`.`id_action` 

JOIN `priority` ON 
    `action`.`id_priority` = `priority`.`id` 

WHERE 
action.department = 1 AND 
action.revision =(SELECT MAX(ar.revision) FROM action as ar WHERE action.id_action = ar.id_action) 

GROUP BY `action`.`id_action` 

ORDER BY `id_priority` asc, `id_parent` asc, `sort_order` asc 
+0

是否要查看「Action」中從未在「Action_Status」表中有條目的所有條目? (即:要求左連接)。此外,您只能看到提交= 0(這應該是最後一項,否則多個同時發生的任務)的評論。如果給定操作的最後一個條目完成(提交的不是0),該怎麼辦?你也想包括它嗎? – DRapp

回答

0

如果我理解得很好,你只需要與最大改版行動,嘗試這樣的事情:

SELECT * 

FROM 

    (SELECT `action`.`id_action`, max(`action`.`revision`), 
     (select id 
     from action as a 
     where a.id_action = action.id_action 
     order by revision desc 
     limit 1) as id_with_max_revision 

    FROM `action` 

    WHERE 
    action.department = 1 

    GROUP BY `action`.`id_action` 

    ) as action_max_revision 
JOIN action on action_max_revision.id_with_max_revision = action.id 
LEFT JOIN action_status ON 
     `action_status`.`id_action` = `action`.`id_action` 

JOIN `priority` ON 
     `action`.`id_priority` = `priority`.`id` 
ORDER BY `id_priority` asc, `id_parent` asc, `sort_order` asc 

內查詢選擇最大改版行動,而外部查詢做其他華而不實之物這是不問題的核心:-)

1

一個很好的建議 - 如果你尋求幫助,簡化您的例子儘可能的展現你的問題的基本根源。沒有人會試圖通過這種方式來理解你的複雜代碼... What I can't seem to do is list the actions with their latest status value. 你談論最新的狀態值,所以我希望你想從action_status表獲得最新的記錄,但是在你的查詢中你檢查了最大的修訂版本table ...爲什麼你按action_id分組,當你想要compaI必須承認我根本不理解設計。

無論如何,我想我幾周前正在解決類似的問題,看到這個MySQL功能reguest(http://bugs.mysql.com/bug.php?id=2020)和我的回覆'7 7月7日13:12'。看下面的例子,它應該對你有幫助:

假設你有每個商店中每件商品的價格表。對於每件商品,您都希望看到最低價格和相關商店,您可以在這裏獲得價格!與你的例子完全一樣 - 你想要一個最大修訂記錄。

create table prices (goods varchar(10), price double, store varchar(10)); 

insert into prices values ('car', 200, 'Amazon'), ('car', 150, 'CarStore'), ('Bread', 2, 'Baker1'), ('Bread', 1, 'Baker2'); 

select goods, min(price), (select store from prices as p where p.goods = prices.goods 
order by price limit 1) as store 
from prices 
group by goods; 

希望這會有所幫助。如果你想選擇更多的列,只需選擇一個id而不是store,並將其作爲子查詢,然後再通過id加入表。

相關問題