SELECT DISTINCT 和 CONCAT return 值不正确
SELECT DISTINCT and CONCAT don't return value correcly
我有一个具有以下值的数据库:
CREATE TABLE test (
Id CHAR (50),
Time TIMESTAMP ,
Value CHAR (50)
);
INSERT INTO test VALUES ('JOE', '2015-06-05 15:36:21', "ZONE1");
INSERT INTO test VALUES ('ANNA', '2015-06-05 14:27:35', "ZONE2");
INSERT INTO test VALUES ('JOE','2015-06-05 16:27:36', "ZONE2");
INSERT INTO test VALUES ('ANNA', '2015-06-05 14:45:31',"ZONE1");
INSERT INTO test VALUES ('JOE','2015-06-05 11:12:31', "ZONE4");
INSERT INTO test VALUES ('ANNA', '2015-06-05 10:25:21',"ZONE3");
我喜欢在最后一个区域找用户
我尝试使用这个 SQL 指令:
SELECT DISTINCT(Id), MAX(Time) AS Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM test
GROUP BY Id;
但是,这是 return:
| Id | Time | json |
|------|------------------------|----------------------------------------------------------------------------------------------|
| ANNA | June, 05 2015 14:45:31 | { "Time":"2015-5-05 02:27:35", "ID":"ANNA", "Zone":"ZONE2" } |
| JOE | June, 05 2015 16:27:36 | { "Time":"2015-5-05 03:36:21", "ID":"JOE", "Zone":"ZONE1" } |
我不明白为什么..... return 不同日期未排序
在第三列...
谢谢!
如果我正确理解你的问题,你想做这样的事情:
SELECT Id, Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM (SELECT *
FROM test
ORDER BY Time DESC) as t
GROUP BY Id;
这里SQL Fiddle看看它是如何工作的...
GL!
P.S.(编辑)您不需要同时使用 DISTINCT 和 GROUP BY 函数,它们做同样的工作......它们也select 组中第一行的值,因此当您想要 select 具有某些值(例如 MAX(time))的行中的值时,只需将其放在排序的顶部即可。我在这个子查询中做到了
(SELECT *
FROM test
ORDER BY Time DESC) as t
编辑: 再次嗨,根据 Andriy 在评论中的建议,我发现我的第一个答案不是解决此问题的最佳方法。因此,感谢 Andriy,我带着更好更安全的解决方案回来了。
第一个是关联子查询:
SELECT Id, Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM test t1
WHERE Time = (SELECT MAX(t2.Time)
FROM test t2
WHERE t1.id = t2.id);
和第二个不相关的子查询:
SELECT t1.Id, t1.Time,
CONCAT('{ "Time":"', DATE_FORMAT(t1.Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(t1.Id AS CHAR), '", "Zone":"', t1.Value, '" }') json
FROM test t1
INNER JOIN (SELECT id, MAX(Time) AS Time
FROM test
GROUP BY id) AS t2
ON t1.id = t2.id AND t1.Time = t2.Time;
关于此的更多信息,您可以阅读 here,有三种方法可以解决此类问题,我给您写了第一种和第二种方式的查询,让您 LEFT JOIN 来尝试一下 :)
并 here is SQL Fiddle 了解这个新解决方案的工作原理。
再次感谢 Andriy M 提出的使用 Group by 和 Order 子句并不明智的建议...
GL!
我有一个具有以下值的数据库:
CREATE TABLE test (
Id CHAR (50),
Time TIMESTAMP ,
Value CHAR (50)
);
INSERT INTO test VALUES ('JOE', '2015-06-05 15:36:21', "ZONE1");
INSERT INTO test VALUES ('ANNA', '2015-06-05 14:27:35', "ZONE2");
INSERT INTO test VALUES ('JOE','2015-06-05 16:27:36', "ZONE2");
INSERT INTO test VALUES ('ANNA', '2015-06-05 14:45:31',"ZONE1");
INSERT INTO test VALUES ('JOE','2015-06-05 11:12:31', "ZONE4");
INSERT INTO test VALUES ('ANNA', '2015-06-05 10:25:21',"ZONE3");
我喜欢在最后一个区域找用户
我尝试使用这个 SQL 指令:
SELECT DISTINCT(Id), MAX(Time) AS Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM test
GROUP BY Id;
但是,这是 return:
| Id | Time | json |
|------|------------------------|----------------------------------------------------------------------------------------------|
| ANNA | June, 05 2015 14:45:31 | { "Time":"2015-5-05 02:27:35", "ID":"ANNA", "Zone":"ZONE2" } |
| JOE | June, 05 2015 16:27:36 | { "Time":"2015-5-05 03:36:21", "ID":"JOE", "Zone":"ZONE1" } |
我不明白为什么..... return 不同日期未排序 在第三列...
谢谢!
如果我正确理解你的问题,你想做这样的事情:
SELECT Id, Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM (SELECT *
FROM test
ORDER BY Time DESC) as t
GROUP BY Id;
这里SQL Fiddle看看它是如何工作的...
GL!
P.S.(编辑)您不需要同时使用 DISTINCT 和 GROUP BY 函数,它们做同样的工作......它们也select 组中第一行的值,因此当您想要 select 具有某些值(例如 MAX(time))的行中的值时,只需将其放在排序的顶部即可。我在这个子查询中做到了
(SELECT *
FROM test
ORDER BY Time DESC) as t
编辑: 再次嗨,根据 Andriy 在评论中的建议,我发现我的第一个答案不是解决此问题的最佳方法。因此,感谢 Andriy,我带着更好更安全的解决方案回来了。
第一个是关联子查询:
SELECT Id, Time,
CONCAT('{ "Time":"', DATE_FORMAT(Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(Id AS CHAR), '", "Zone":"', Value, '" }') json
FROM test t1
WHERE Time = (SELECT MAX(t2.Time)
FROM test t2
WHERE t1.id = t2.id);
和第二个不相关的子查询:
SELECT t1.Id, t1.Time,
CONCAT('{ "Time":"', DATE_FORMAT(t1.Time, '%Y-%e-%d %h:%i:%s'), '", "ID":"', CAST(t1.Id AS CHAR), '", "Zone":"', t1.Value, '" }') json
FROM test t1
INNER JOIN (SELECT id, MAX(Time) AS Time
FROM test
GROUP BY id) AS t2
ON t1.id = t2.id AND t1.Time = t2.Time;
关于此的更多信息,您可以阅读 here,有三种方法可以解决此类问题,我给您写了第一种和第二种方式的查询,让您 LEFT JOIN 来尝试一下 :)
并 here is SQL Fiddle 了解这个新解决方案的工作原理。
再次感谢 Andriy M 提出的使用 Group by 和 Order 子句并不明智的建议...
GL!