私の質問はthis質問に関連していますが、検索フィルターごとに日付の時間が異なるため、個々の検索条件に基づいて特定のカメラを通過した車を取得する
MYSQL/MARIADBスキーマおよびサンプル・データ:
CREATE DATABASE IF NOT EXISTS `puzzle` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
USE `puzzle`;
DROP TABLE IF EXISTS `event`;
CREATE TABLE `event` (
`eventId` bigint(20) NOT NULL AUTO_INCREMENT,
`sourceId` bigint(20) NOT NULL COMMENT 'think of source as camera',
`carCode` varchar(40) NOT NULL COMMENT 'ex: A',
`carNumber` varchar(40) NOT NULL COMMENT 'ex: 5849',
`createdOn` datetime DEFAULT NULL,
PRIMARY KEY (`eventId`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `event` (`eventId`, `sourceId`, `carCode`, `carNumber`, `createdOn`) VALUES
(1, 44,'A', '4456', '2016-09-20 20:24:05'),
(2, 26,'B', '26484', '2016-09-20 20:24:05'),
(3, 5,'A', '4456', '2016-09-20 20:24:06'),
(4, 3,'C', '72704', '2016-09-20 20:24:15'),
(5, 3,'D' ,'399606', '2016-09-20 20:26:15'),
(6, 5, 'A', '4456', '2016-09-20 20:27:25'),
(7, 44,'C', '72704', '2016-09-20 20:29:25'),
(8, 3,'A' ,'4456', '2016-09-20 20:30:55'),
(9, 44,'B' ,'26484', '2016-09-20 20:34:55'),
(10, 26,'B' ,'4456', '2016-09-20 20:35:15'),
(11, 3, 'C','72704', '2016-09-20 20:35:15'),
(12, 3,'D', '399606', '2016-09-20 20:44:35'),
(13, 26,'A' ,'4456', '2016-09-20 20:49:45');
要件:
ユーザーが2つの検索フィルタを持っています。
彼は最初の検索フィルターで、特定の日付と時刻にsourceId(44,3)を持つすべての車を取得します。 (e.createdOn> '2016-09-20 20:24:00'とe.createdOn < '2016-09-20 20:35:00 ')
2番目の検索フィルタでは、別の日時のためにsourceIdが(26,3,5)にある車。今、私はすべて(carNumbersを取得したい(e.createdOn> '2016年9月20日20時36分○○秒' とe.createdOn < '2016年9月20日午後08時49分○○秒')
を仮定carCode)を使用します。
実際のテーブルには3億以上のレコードが含まれているため、クエリが高速になる必要があります。これまでに以下の
は、SQLは、この問題を解決することはできませんか私はバックエンドのコーディングを使用する必要がある場合、私は疑問に思う私は、クエリで行くことができる最大値(そのも有効な結果を生成していない)
select distinct e1.carNumber, e1.carCode from event e1
inner join (select e2.carNumber, e2.carCode from event e2 where e2.sourceId in (44,3)) e3 on e1.carNumber= e3.carNumber
inner join (select e2.carNumber, e2.carCode from event e2 where e2.sourceId in (44,3) ) e4 on e1.carCode= e4.carCode
inner join (select e2.carNumber, e2.carCode from event e2 where e2.sourceId in (26,3,5)) e5 on e1.carNumber= e5.carNumber
inner join (select e2.carNumber, e2.carCode from event e2 where e2.sourceId in (26,3,5)) e6 on e1.carCode= e6.carCode
のですか?
使用中のMySQL/MariaDBのバージョン:
mariadb-5.5.50
のmysql-5.5.51
なぜ4つの結合を行うのですか?あなたの拘束でwhere節を実行します。各サブクエリは300Mを読み込みます。あなたは5 * 300M行を読むことを意味します。 – AxelH
Bascially私は両方の検索フィルターの結果を交差させたい。 –