2012-07-16 20 views
0

我正在開發一個小項目,就像技術人員的議程,每個技術人員都分配在日常議程中。使用「NOT IN」查詢過濾的問題

我正在尋找一個查詢,顯示我只在一個分支尚未分配在一天中的技術人員(公司有兩個分支:東,西)

我試着查詢是:

SELECT * 
FROM technicians 
WHERE id_tech NOT 
IN ( 
    SELECT id_tech 
    FROM hours 
    ) 
AND branch = 'West' 

該查詢返回我我想要的,但我不知道,我已經試過許多查詢如何使用日期過濾這些信息,並返回我所有重複結果的colums。

我的表是,小時表,其中每一高科技有一個任務:

CREATE TABLE IF NOT EXISTS `hours` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_tech` int(11) NOT NULL, 
    `9_30` varchar(140) DEFAULT NULL, 
    `10_30` varchar(50) DEFAULT NULL, 
    `11_30` varchar(50) DEFAULT NULL, 
    `12_30` varchar(50) DEFAULT NULL, 
    `1_30` varchar(50) DEFAULT NULL, 
    `2_30` varchar(50) DEFAULT NULL, 
    `3_30` varchar(50) DEFAULT NULL, 
    `4_30` varchar(50) DEFAULT NULL, 
    `5_30` varchar(50) DEFAULT NULL, 
    `6_30` varchar(50) DEFAULT NULL, 
    `comments` varchar(50) DEFAULT NULL, 
    `date` text NOT NULL, 
    PRIMARY KEY (`id`) 
) TYPE=MyISAM ROW_FORMAT=DYNAMIC; 

INSERT INTO `hours` (`id`, `id_tech`, `9_30`, `10_30`, `11_30`, `12_30`, `1_30`, `2_30`, `3_30`, `4_30`, `5_30`, `6_30`, `comments`, `date`) VALUES 
(1, 1, 'Router with problems, Customer ID 111', 'Router with problems, Customer ID 111', 'Router with problems, Customer ID 111', 'Router with problems, Customer ID 111', 'Router with problems, Customer ID 111', 'Desktop with problems, Customer ID 121', NULL, NULL, NULL, 'Network problems, Customer ID 121', 'Router with problems, Customer ID 111', '16-07-2012'), 
(3, 3, 'Network with problems, Customer ID 111', 'Network with problems, Customer ID 111', NULL, NULL, NULL, NULL, NULL, NULL, 'Network with problems, Customer ID 111', '', 'Didn''t came to work today', '16-07-2012'); 

,維修人員表:

CREATE TABLE IF NOT EXISTS `technicians` (
    `id_tech` int(11) NOT NULL, 
    `name` varchar(50) COLLATE utf8_spanish_ci NOT NULL, 
    `branch` varchar(50) COLLATE utf8_spanish_ci NOT NULL, 
    PRIMARY KEY (`id_tech`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci ROW_FORMAT=DYNAMIC; 


INSERT INTO `technicians` (`id_tech`, `name`, `branch`) VALUES 
(1, 'Peter', 'East'), 
(2, 'Juan', 'East'), 
(3, 'Rick', 'West'), 
(4, 'Mario', 'West'); 
+1

剛上表結構的選擇的註釋。所有'6_30','7_30'等欄目的重點是什麼?爲什麼不製作一個「時間」專欄,如果在6點52分發生什麼事情,你可以記錄正確的時間? – nico 2012-07-16 06:38:54

+0

「9_30」「10_30」是時間間隔,其思想是在每個單元格上爲技術添加任務,可以在同一天或未來添加,也可以估計需要多少時間爲解決這個問題的技術,謝謝你的評論:) – Mario 2012-07-16 06:47:30

+0

那麼如果有4個短期任務要做,那該怎麼辦?如果任務花費的時間超過一個時間間隔,比如說1.5個時間間隔? – nico 2012-07-16 11:28:39

回答

0

把日期比較作爲條件檢查的一個在LEFT JOIN

SELECT a.* 
FROM technicians a 
LEFT JOIN hours b ON 
      a.id_tech = b.id_tech AND 
      STR_TO_DATE(b.date, '%d-%m-%Y') = CURDATE() 
WHERE a.branch = 'West' AND b.id_tech IS NULL 

^這會讓所有沒有任務的技術人員爲當天。

-- Get all West branch technicians who have not been assigned within past week 

SELECT a.* 
FROM technicians a 
LEFT JOIN hours b ON 
      a.id_tech = b.id_tech AND 
      STR_TO_DATE(b.date, '%d-%m-%Y') >= CURDATE() - INTERVAL 1 WEEK 
WHERE a.branch = 'West' AND b.id_tech IS NULL 

如果你想在過去的某一天比較:

-- Get all West branch technicians who have not been assigned on a particular 
-- day in the past: 

SELECT a.* 
FROM technicians a 
LEFT JOIN hours b ON 
      a.id_tech = b.id_tech AND 
      STR_TO_DATE(b.date, '%d-%m-%Y') = CAST('2012-06-14' AS DATE) 
WHERE a.branch = 'West' AND b.id_tech IS NULL 
+0

謝謝!這工作非常好,很抱歉,我一直很忙,我無法完成這個項目 – Mario 2012-07-30 06:04:48