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 A
UNION 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';