Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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中分组和联接表的特定行中选择数据_Mysql_Sql_Group By - Fatal编程技术网

从MySQL中分组和联接表的特定行中选择数据

从MySQL中分组和联接表的特定行中选择数据,mysql,sql,group-by,Mysql,Sql,Group By,我有两张桌子,客户和订单是内部连接的。客户可以有多个与其关联的订单。在我的选择中,我然后按customers.id分组。我需要选择每个客户的最新订单,还需要选择在该订单中花费的金额。目前,我可以选择最近的订单日期,但不知道如何选择与订单日期同一行中的金额 这是我当前的查询: SELECT first_name, last_name, email, MAX(order_date) AS recent_order, amount -- this ne

我有两张桌子,客户和订单是内部连接的。客户可以有多个与其关联的订单。在我的选择中,我然后按customers.id分组。我需要选择每个客户的最新订单,还需要选择在该订单中花费的金额。目前,我可以选择最近的订单日期,但不知道如何选择与订单日期同一行中的金额

这是我当前的查询:

SELECT 
    first_name, 
    last_name, 
    email, 
    MAX(order_date) AS recent_order, 
    amount -- this needs to select amount associated with recent_order
FROM customers
JOIN orders
    ON customers.id = orders.customer_id
GROUP BY customers.id;
查询选择最近日期,但不选择与最近订单日期关联的金额

表格声明:

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    amount DECIMAL(8,2),
    customer_id INT,
    FOREIGN KEY(customer_id) REFERENCES customers(id)
);


我建议在
where
子句中使用相关子查询:

SELECT c.*, o.*  -- or whatever columns you want
FROM customers c JOIN
     orders o
     ON c.id = o.customer_id
WHERE o.order_date = (SELECT max(o2.order_date)
                      FROM orders o2
                      WHERE o2.customer_id = o.customer_id
                     );

为了提高性能,您需要一个关于
订单(客户id、订单日期)的索引

我建议在
where
子句中使用一个相关子查询:

SELECT c.*, o.*  -- or whatever columns you want
FROM customers c JOIN
     orders o
     ON c.id = o.customer_id
WHERE o.order_date = (SELECT max(o2.order_date)
                      FROM orders o2
                      WHERE o2.customer_id = o.customer_id
                     );
为了提高性能,您需要一个关于
订单(客户id、订单日期)的索引

使用以下方法:

选择前1名
t1.名字,
t1.姓,
t1.电子邮件,
t2.订单日期,
t2.金额
来自客户t1
联合命令t2
在t1.id=t2.customer\u id上
订购人
t2.订单日期
如果目的是返回所有带有最新订单日期的行,则添加一个
groupby t1.id
。如果每个订单都由
订单
中的一行重新提交,请忽略此项。请注意,这不会合计金额。您必须在代码中这样做,否则将使用不同的查询。还要注意,此查询的性能将受到索引配置的影响。如果订单日期不是索引的一部分,并且该表包含大量数据集,则可能无法执行此查询。

使用以下方法:

选择前1名
t1.名字,
t1.姓,
t1.电子邮件,
t2.订单日期,
t2.金额
来自客户t1
联合命令t2
在t1.id=t2.customer\u id上
订购人
t2.订单日期


如果目的是返回所有带有最新订单日期的行,则添加一个
groupby t1.id
。如果每个订单都由
订单
中的一行重新提交,请忽略此项。请注意,这不会合计金额。您必须在代码中这样做,否则将使用不同的查询。还要注意,此查询的性能将受到索引配置的影响。如果订单日期不是索引的一部分,并且表包含大量数据集,则可能无法执行此查询。

第一个选项抛出“错误1111(HY000):组函数的使用无效”。第二个选项抛出一个“ERROR 1064(42000):您的SQL语法有一个错误;请查看与MySQL服务器版本对应的手册,以了解在第21行“groupby customers.id”附近使用的正确语法。有什么办法解决这个问题吗?第二个办法应该是现在就开始工作。首先,问题是使用MAX和GROUP by在GROUP by之后使用order by只对分组的行进行排序,而不是对组中的值进行排序。第一个选项引发“ERROR 1111(HY000):GROUP函数的使用无效”。第二个选项抛出一个“ERROR 1064(42000):您的SQL语法有一个错误;请查看与MySQL服务器版本对应的手册,以了解在第21行“groupby customers.id”附近使用的正确语法。有什么办法解决这个问题吗?第二个办法应该是现在就开始工作。一开始的问题是使用MAX和GROUP by在GROUP by之后使用order by只对分组的行进行排序,而不是对组中的值进行排序。您为什么推荐这样做?谢谢,这很有效!但是,有没有办法使用GROUPBY来实现这一点,因为据我所知,拥有子查询将减少performance@Cirrus86 . . . 实际上,
groupby
通常会比较慢。添加建议的索引,您可能无法获得更快的查询。@RMac。因为它应该在大多数数据库(包括MySQL)中具有最快的性能。为什么推荐它?谢谢,这很管用!但是,有没有办法使用GROUPBY来实现这一点,因为据我所知,拥有子查询将减少performance@Cirrus86 . . . 实际上,
groupby
通常会比较慢。添加建议的索引,您可能无法获得更快的查询。@RMac。因为它应该在大多数数据库(包括MySQL)中具有最快的性能。问题是GROUP BY子句不能位于ORDER BY之后,至少在MySQL中是这样。将GROUP BY放在ORDER BY之前只会对GROUP进行排序这就是为什么在查询中保留TOP 1和ORDER BY部分…问题是GROUP BY子句不能位于ORDER BY之后,至少在MySQL中是这样。将GROUP BY放在ORDER BY之前只会对GROUP进行排序这就是为什么保留查询中的TOP 1和ORDER BY部分。。。
SELECT c.*, o.*  -- or whatever columns you want
FROM customers c JOIN
     orders o
     ON c.id = o.customer_id
WHERE o.order_date = (SELECT max(o2.order_date)
                      FROM orders o2
                      WHERE o2.customer_id = o.customer_id
                     );