因為樓主沒有提供資料庫結構,所以自己建了一個資料表。從原始碼看將日期跟時間分開兩個欄位,其實可以合併在一起。
CREATE TABLE air
(id INT AUTO_INCREMENT, latlng varchar(50), pm int, datestamp datetime, PRIMARY KEY (id) )
;
INSERT INTO air
(latlng, pm, datestamp)
values
('20,30', 10 , '2016-05-22 00:00:00') ,
('20,30', 50 , '2016-05-22 10:10:00') ,
('20,30', 40 , '2016-05-22 10:30:00') ;
-- 原查詢語法: 舊紀錄在前
-- SELECT * FROM `air`;
-- 查詢語法2: 新紀錄在前
SELECT tmp.* FROM
( SELECT * FROM `air` ORDER BY `datestamp`
) tmp GROUP BY `latlng` ;
可以直接看線上 demo: http://ideone.com/WHeIwg
我試了大大的語法 發現有問題
因為我的感測器 GPS的經緯度 和日期時間都是分開的
就是經度GPS1 緯度GPS2 日期DATE 時間TIME的資料庫
這樣就無法用你的方式 是否還有可以不用合併就可以排序顯示的方法??
感謝你的回答
-- 建立資料表
CREATE TABLE `air` (
`id` int(11) NOT NULL,
`latitude` varchar(50) NOT NULL,
`longitude` varchar(50) NOT NULL,
`pm` int(11) DEFAULT NULL,
`date` date NOT NULL,
`time` time NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- 資料表索引 `air`
--
ALTER TABLE `air`
ADD PRIMARY KEY (`id`);
--
-- 資料表資料 `air`
--
INSERT INTO `air` (`id`, `latitude`, `longitude`, `pm`, `date`, `time`) VALUES
(1, '20', '30', 10, '2016-05-22', '00:00:00'),
(2, '20', '30', 50, '2016-05-22', '10:10:00'),
(3, '20', '30', 40, '2016-05-22', '10:30:00'),
(4, '20', '30', 50, '2016-05-23', '10:10:00'),
(5, '20', '40', 60, '2016-05-23', '10:10:00');
-- 查詢不同經緯度最新 pm 資料
SELECT latest.latitude, latest.latitude, raw.pm, latest.date, latest.time
FROM
(
SELECT latitude, longitude, CONCAT(`latitude`, ',', `longitude`) AS latlng, MAX(CONCAT(`date`, ' ', `time`)) AS date_time,
TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', 1)) AS 'date',
TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', -1)) AS 'time'
FROM `air`
GROUP BY CONCAT(`latitude`, ',', `longitude`)
) AS latest
INNER JOIN
(
SELECT *, CONCAT(`latitude`, ',', `longitude`) AS latlng, CONCAT(`date`, ' ', `time`) AS date_time
FROM `air`
) AS raw
ON raw.latlng = latest.latlng
AND raw.date_time = latest.date_time;
http://203.64.167.212/ex0/data1.png
http://203.64.167.212/ex0/data2.png
不好意思 我貼了你下面那些語法 改成我的結構 還是無法欸 而且連舊的也無法出現了
上面的圖片 分別是我的 資料和結構
謝謝你的解答
SELECT latest.`gps-1`, latest.`gps-2`, raw.pm2_5, latest.date, latest.time
FROM
(
SELECT `gps-1`, `gps-2`, CONCAT(`gps-1`, ',', `gps-2`) AS latlng, MAX(CONCAT(`date`, ' ', `time`)) AS date_time,
TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', 1)) AS 'date',
TRIM(SUBSTRING_INDEX(MAX(CONCAT(`date`, ' ', `time`)) ,' ', -1)) AS 'time'
FROM `air`
GROUP BY CONCAT(`gps-1`, ',', `gps-2`)
) AS latest
INNER JOIN
(
SELECT *, CONCAT(`gps-1`, ',', `gps-2`) AS latlng, CONCAT(`date`, ' ', `time`) AS date_time
FROM `air`
) AS raw
ON raw.latlng = latest.latlng
AND raw.date_time = latest.date_time;
太感謝你了大大 成功了 感恩感恩超厲害的