2013-02-05 49 views
1

我試圖構建一個應用程序,除了記錄銷售數量以外,還維護主管和他/她的團隊之間的歷史記錄。帶額外字段的MySQL鏈接表創建笛卡爾積

CREATE TABLE `emp` (
    `id` int(11) NOT NULL, 
    `nombre` varchar(45) NOT NULL, 
    `apellido` varchar(45) NOT NULL, 
    `tl_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `tlFK_idx` (`tl_id`), 
    CONSTRAINT `tlFK` FOREIGN KEY (`tl_id`) REFERENCES `emp` (`id`) 


CREATE TABLE `super` (
    `id` int(11) NOT NULL, 
    `nombre` varchar(45) NOT NULL, 
    `apellido` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `emp_super` (
    `emp_id` int(11) NOT NULL, 
    `super_id` int(11) NOT NULL, 
    `fecha` date NOT NULL, 
    PRIMARY KEY (`emp_id`,`super_id`,`fecha`), 
    KEY `empFK_idx` (`emp_id`), 
    KEY `superFK_idx` (`super_id`), 
    CONSTRAINT `empsuperFK` FOREIGN KEY (`emp_id`) REFERENCES `emp` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `super_empFK` FOREIGN KEY (`super_id`) REFERENCES `super` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

正如你所看到的,表emp_super是鏈接表,除了有一個日期字段。

emp_id super_id fecha 
101863 101404 2012-10-15 
101863 101503 2012-10-01 
102403 101404 2012-10-15 
102403 101503 2012-10-01 
103052 101404 2012-10-15 
103052 101503 2012-10-01 
103718 101404 2012-10-15 
103718 101503 2012-10-01 

的關鍵是要保持在一個主管被分配到一組的記錄,這樣,當有任何變化,新的上司不會繼承以前的領導下,他的團隊績效。 我一直在研究一個查詢來提取某個特定組的銷售情況,但我立即注意到即使我認爲自己正在建立所有正確的連接,我也會收到一個笛卡爾產品。

這裏的銷售表:

CREATE TABLE `sales` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `sale_date` date NOT NULL, 
    `product_id` int(11) NOT NULL, 
    `emp_id` int(11) NOT NULL, 
    `qty` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `empFK_idx` (`emp_id`), 
    KEY `campaignFK_idx` (`product_id`), 
    CONSTRAINT `empFK` FOREIGN KEY (`emp_id`) REFERENCES `emp_super` (`emp_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `productFK` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

通常情況下,使用日期打交道時,我嘗試和限制日期到主表我的數據是從,但在這種情況下,來的時候還需要考慮到員工 - 主管關係的日期。

我的查詢到目前爲止是這樣的:

SELECT s.sale_date,su.id,concat_ws(' ',su.nombre,su.apellido), p.name,e.id,concat_ws(' ',e.nombre,e.apellido), s.qty 
from tracker.emp e, tracker.products p, tracker.sales s,tracker.super su, tracker.emp_super es 
where e.id = es.emp_id 
and su.id = es.super_id 
and s.product_id = p.id 
and e.id = s.emp_id 
and s.sale_date between '2012-10-01' and '2012-10-15' 
and es.fecha between '2012-10-01' and '2012-10-15' 
order by su.id,p.name,e.id; 

如果我減少日期到14,然後我收到正確的結果,因爲其他主管沒有加入,直到15有沒有人遇到過這種業務要求:保持領導的記錄,以便新領導不繼承前任成就或失誤?

謝謝您的任何建議。

+1

我首先想到的是有一個領域來存儲主管和工人之間的關係結束日期。 –

+0

我也很好奇字段emp.tl_id的功能。 –

+0

tl_id引用員工與團隊負責人的關係。爲了這個問題的目的,它沒有提出問題。 – wp4nuv

回答

0

您需要考慮監督角色何時結束。

這會給你,但我懷疑它不會很有效。

SELECT e1.emp_id 
     ,e1.super_id 
     ,e1.fecha 
     ,MIN(DATEADD(DAY, -1, e2.fecha)) AS end 
FROM emp_super e1 
     INNER JOIN 
     emp_super e2 ON e1.emp_id=e2.emp_id 
         AND 
         e1.fecha<e2.fecha 
GROUP BY e1.emp_id 
     ,e1.super_id 
     ,e1.fecha 

也許鏈接表上的最後一列更新TRIGGER會更好?

+0

我們儘可能多地思考,但一起去了不同的設計。我現在不在工作,所以我沒有與我的代碼,但一旦我可以,我會張貼新的設計,並解釋我們如何計算出來。我會說,對於這個項目的目的,維護歷史數據不是通過員工 - 主管關係來完全管理的。當我有剩餘的數據時,我會發布更多信息。 – wp4nuv