Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL使用GROUPBY从同一行中提取其他varchar字段_Mysql - Fatal编程技术网

MySQL使用GROUPBY从同一行中提取其他varchar字段

MySQL使用GROUPBY从同一行中提取其他varchar字段,mysql,Mysql,我有一个如下结构的事务表: +--------------------------------------+--------------------------+------------+ | contact_id | return_reason | date | +--------------------------------------+--------------------------+-------

我有一个如下结构的事务表:

+--------------------------------------+--------------------------+------------+
| contact_id                           | return_reason            | date       |
+--------------------------------------+--------------------------+------------+
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2014-01-25 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R08 - Payment Stopped    | 2013-09-15 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-08-15 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-07-31 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-05-31 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped    | 2013-03-15 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped    | 2013-04-15 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped    | 2013-05-15 |
+--------------------------------------+--------------------------+------------+
我要查找的数据是每个联系人id的最新返回原因

我目前的问题是:

从交易组中按联系人id顺序按ram日期描述选择联系人id,返回原因为最近返回原因,最大(日期)为ram日期

我的查询结果得出了正确的返回原因,但我不确定它是否这样做,因为它是准确的/正确的,如果它是因为可能性对我有利。恐怕是因为这个非常相似的查询提取了错误的日期值:


从交易组中按联系人id顺序按ram日期描述选择联系人id,返回原因为最近返回原因,日期为ram日期

你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的

您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数


解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:

你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的

您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数


解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:

你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的

您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数


解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:

你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的

您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数


解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解它是如何工作的:

正如Fabien所提到的,您很幸运,因为您使用的是对
groupby
节点的MySQL扩展。如文件所述,
select
中不在
groupby
中且没有聚合函数的列是从任意行分配的值。这意味着
return\u reason
来自任意行,而不是具有最大日期的行

下面是一个非常简单的方法来获取最新的原因:

select contact_id,
       substring_index(group_concat(return_reason order by date desc), ',', 1
                      ) as most_recent_return_reason,
       max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;

正如Fabien所提到的,您很幸运,因为您使用的是对
groupby
节点的MySQL扩展。如文件所述,
select
中不在
groupby
中且没有聚合函数的列是从任意行分配的值。这意味着
return\u reason
来自任意行,而不是具有最大日期的行

下面是一个非常简单的方法来获取最新的原因:

select contact_id,
       substring_index(group_concat(return_reason order by date desc), ',', 1
                      ) as most_recent_return_reason,
       max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;

正如Fabien所提到的,您很幸运,因为您使用的是对
groupby
节点的MySQL扩展。如文件所述,
select
中不在
groupby
中且没有聚合函数的列是从任意行分配的值。这意味着
return\u reason
来自任意行,而不是具有最大日期的行

下面是一个非常简单的方法来获取最新的原因:

select contact_id,
       substring_index(group_concat(return_reason order by date desc), ',', 1
                      ) as most_recent_return_reason,
       max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;

正如Fabien所提到的,您很幸运,因为您使用的是对
groupby
节点的MySQL扩展。如文件所述,
select
中不在
groupby
中且没有聚合函数的列是从任意行分配的值。这意味着
return\u reason
来自任意行,而不是具有最大日期的行

下面是一个非常简单的方法来获取最新的原因:

select contact_id,
       substring_index(group_concat(return_reason order by date desc), ',', 1
                      ) as most_recent_return_reason,
       max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;

事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符

你可以这样做

SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
  SELECT MAX(t2.date)
  FROM transactions AS t2
  WHERE t2.contact_id = t.contact_id
);

此外,您可以在此SQL FIDLE上看到差异:

事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符

你可以这样做

SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
  SELECT MAX(t2.date)
  FROM transactions AS t2
  WHERE t2.contact_id = t.contact_id
);

此外,您可以在此SQL FIDLE上看到差异:

事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符

你可以这样做

SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
  SELECT MAX(t2.date)
  FROM transactions AS t2
  WHERE t2.contact_id = t.contact_id
);

此外,您可以在此SQL FIDLE上看到差异:

事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符

你可以这样做

SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
  SELECT MAX(t2.date)
  FROM transactions AS t2
  WHERE t2.contact_id = t.contact_id
);

此外,您可以在这个SQL小提琴上看到差异:

多亏了all。GROUP_CONCAT似乎对我有用,@GordonLinoff也因为包含了快速子字符串索引语法而获得了加分。谢谢大家。GROUP_CONCAT似乎对我有用,@GordonLinoff也因为包含了快速子字符串索引语法而获得了加分。谢谢大家。CONCAT小组似乎在为我工作,@GordonLinoff因为加入了qu而获得了加分