MySQL-如何连接/联合这两个选择来进行单个查询?
我的数据库上有下表:MySQL-如何连接/联合这两个选择来进行单个查询?,mysql,join,relational-database,union,Mysql,Join,Relational Database,Union,我的数据库上有下表: CREATE TABLE IF NOT EXISTS `heartbeat` ( `code` int(11) NOT NULL AUTO_INCREMENT, `IMEI` varchar(15) NOT NULL, `oil_electricity` tinyint(1) NOT NULL, `gps_tracking` tinyint(1) NOT NULL, `alarm_status` tinyint(3) NOT NULL, `charg
CREATE TABLE IF NOT EXISTS `heartbeat` (
`code` int(11) NOT NULL AUTO_INCREMENT,
`IMEI` varchar(15) NOT NULL,
`oil_electricity` tinyint(1) NOT NULL,
`gps_tracking` tinyint(1) NOT NULL,
`alarm_status` tinyint(3) NOT NULL,
`charge` tinyint(1) NOT NULL,
`ACC` tinyint(1) NOT NULL,
`defense` tinyint(1) NOT NULL,
`voltage_level` tinyint(1) unsigned NOT NULL,
`gsm_signal` tinyint(1) unsigned NOT NULL,
`alarm` tinyint(1) NOT NULL,
`language` tinyint(1) NOT NULL,
`datetime` datetime NOT NULL,
PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1451 ;
我有两个选择,需要将结果作为一个查询语句连接在一起:
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime`<="2014-07-16 12:00"
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime` BETWEEN "2014-07-16 12:00" AND "2014-07-17 15:00"
SELECT*FROM heartbeat,其中'IMEI`=1234567890121345和'datetime`在sql中有一个联合构造,实现方式如下:
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime`<="2014-07-16 12:00" JOIN (SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime` BETWEEN "2014-07-16 12:00" AND "2014-07-17 15:00")
UNION
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime`<="2014-07-16 12:00" UNION (SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime` BETWEEN "2014-07-16 12:00" AND "2014-07-17 15:00")
SELECT*FROM heartbeat,其中'IMEI`=123456789012345和'datetime`好的,只要做一点更改就可以了
很抱歉问这么简单的问题
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime`<="2014-07-16 12:00" ORDER BY `code` desc LIMIT 1
UNION
SELECT * FROM heartbeat WHERE `IMEI`=123456789012345 AND `datetime` BETWEEN "2014-07-16 12:00" AND "2014-07-17 15:00"
SELECT*FROM heartbeat,其中'IMEI`=123456789012345和'datetime`在create语句中,您的主键有问题,我假设这只是一个输入错误,应该是'code'。至于这个问题,我不清楚您是否必须使用联接或联合,或者您是否只需要这两个查询只需一个查询即可产生的结果。如果是后一种情况,则应采用以下方法:
SELECT * FROM heartbeat
WHERE IMEI='123456789012345' AND datetime <= '2014-07-17 15:00';
SELECT*FROM heartbeat
其中,IMEI='123456789012345'和datetime AUNION ALL
集合运算符将更有效,因为它跳过了识别和删除重复行的额外工作。您没有在这两条语句上打开括号。我想我应该把它们都放在括号内,这样就行了?使用UNION-ALL
set操作符代替查询中的或
,并将单独的SELECT包装在括号中。(请注意,两个查询可能返回同一行。)(如果datetime
正好是'2014-07-16 12:00',这将匹配两个查询中的谓词。这有点奇怪……为什么不使用单个查询来实现这一点,datetime注意,UNION
set操作符将识别并从集合中删除重复的行。如果不需要数据库来完成额外的工作,请使用UNION ALL
set运算符。(两个查询有可能返回同一行,在该边界上,datetime
,两个查询可以返回同一行。为了避免这种情况,请将第一个查询更改为使用哦,我忘了这一点。当然,如果要将ORDER by…LIMIT…
添加到两个查询中,我只会使用,yo您需要将每个查询包含在paren中,然后与UNION ALL
组合。为了保证返回结果的顺序,您还需要在最后一个paren之后添加一个order BY
。(将……代码添加到……DEC限制…<代码>到第一个查询,这解释了为什么要使用两个查询。对于PixEffCE,请考虑在心跳(IMEI,DATETEM)/<代码>中添加索引…<代码>。
SELECT * FROM heartbeat
WHERE IMEI='123456789012345' AND datetime <= '2014-07-17 15:00';