0

私は小さなプロジェクトに取り組んでいます。これは技術者の議題のようなもので、各技術者は毎日の議題に割り当てられます。

ある支店に割り当てられていない技術者のみを表示するクエリを探しています(会社には東と西の2つの支店があります)

私が試したクエリは次のとおりです。

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

このクエリは必要なものを返しますが、これを日付でフィルタリングする方法がわかりません。多くのクエリを試し、結果が重複しているすべての列を返します。

私のテーブルは、各技術者がタスクを持っている時間テーブルです。

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

1 に答える 1

0

日付比較を条件付きチェックの1つとして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
于 2012-07-16T06:51:19.080 に答える