Mysql 组内的SQL组

Mysql 组内的SQL组,mysql,sql,group-by,Mysql,Sql,Group By,我有如下示例中的事务数据: Name | Price George | 20 George | 20 George | 20 George | 30 Paul | 20 Paul | 20 Paul | 30 Paul | 30 Paul | 35 我通常需要按用户分组,并按交易数量排序,但在该用户组中,还需要按该价格的交易量按价格顺序进行分组。 我需要这个结果: Name | Price | Count Paul | 20 | 2

我有如下示例中的事务数据:

Name    | Price
George  | 20
George  | 20
George  | 20
George  | 30
Paul    | 20
Paul    | 20
Paul    | 30
Paul    | 30
Paul    | 35
我通常需要按用户分组,并按交易数量排序,但在该用户组中,还需要按该价格的交易量按价格顺序进行分组。 我需要这个结果:

Name    | Price | Count
Paul    | 20    | 2
Paul    | 30    | 2
Paul    | 35    | 1
George  | 20    | 3
George  | 30    | 1
更新

它位于MySQL 5.5数据库中。我需要在Laravel中查询fluent,但在SQL中使用它是一个很大的进步


提前谢谢。

给你。这可以在MySQL 8.x中完成。所需的双重排序需要使用两个表表达式,如下所示:

select
  x.name, x.price, x.cnt
from (
  select name, price, count(*) as cnt
  from t
  group by name, price
) x
join (
  select name, row_number() over(order by cnt desc) as ob
  from (
    select name, count(*) as cnt
    from t
    group by name
  ) y
) z on x.name = z.name
order by z.ob, x.cnt desc
结果:

name    price  cnt
------  -----  ---
Paul       20    2
Paul       30    2
Paul       35    1
George     20    3
George     30    1
作为参考,我使用的数据脚本是:

create table t (
  name varchar(10),
  price int
);

insert into t (name, price) values
  ('George', 20),
  ('George', 20),
  ('George', 20),
  ('George', 30),
  ('Paul', 20),
  ('Paul', 20),
  ('Paul', 30),
  ('Paul', 30),
  ('Paul', 35);

给你。这可以在MySQL 8.x中完成。所需的双重排序需要使用两个表表达式,如下所示:

select
  x.name, x.price, x.cnt
from (
  select name, price, count(*) as cnt
  from t
  group by name, price
) x
join (
  select name, row_number() over(order by cnt desc) as ob
  from (
    select name, count(*) as cnt
    from t
    group by name
  ) y
) z on x.name = z.name
order by z.ob, x.cnt desc
结果:

name    price  cnt
------  -----  ---
Paul       20    2
Paul       30    2
Paul       35    1
George     20    3
George     30    1
作为参考,我使用的数据脚本是:

create table t (
  name varchar(10),
  price int
);

insert into t (name, price) values
  ('George', 20),
  ('George', 20),
  ('George', 20),
  ('George', 30),
  ('Paul', 20),
  ('Paul', 20),
  ('Paul', 30),
  ('Paul', 30),
  ('Paul', 35);



是的,这是可能的。你没有说你使用哪种数据库会限制我们的能力help@CaiusJard谢谢,我更新了我的问题,我使用MySQL数据库。请指定您的MySQL版本。@Akina您的评论是正确的。是的,这是可能的。你没有说你使用哪种数据库会限制我们的能力help@CaiusJard谢谢,我更新了我的问题,我使用的是MySQL数据库。请指定您的MySQL版本。@Akina您的评论切中要害。谢谢您的回答。但我需要根据总交易量对用户进行排序,然后根据交易量按价格进行排序。如果我这样做:-按名称从交易组中选择名称、价格、计数(*)作为cnt,按cnt desc选择价格订单-它将仅针对某个价格的用户交易数量进行订单,我需要您首先针对交易总数进行订单,而不考虑价格。@J_J根据您需要的订单进行更新。谢谢您的回答。但我需要根据总交易量对用户进行排序,然后根据交易量按价格进行排序。如果我这样做:-按名称从交易组中选择名称、价格、计数(*)作为cnt,按cnt desc选择价格订单-它将只按价格订购用户交易的数量,我需要您先订购交易总数,而不管价格如何。@J_J根据您需要的订购进行更新。谢谢Akina,你的解决方案解决了问题。不幸的是,我需要使用laravel的查询生成器进行查询,当我进行子查询时,参数被替换为错误的:@J_J使用原始SQL。无论如何,您必须至少使用
select(db::raw
用于字段别名…@Akina很好的解决方案。但是,我会使用显式连接而不是自然连接。自然连接容易出错且模糊。+1另一个注意事项是,我会用tcnt DESC替换
ORDER,用tcnt DESC、name、cnt DESC替换
ORDER,以确保稳定的顺序。后者容易出错且在复杂的查询中可能是晦涩难懂的,但是这是一个简单的查询,没有错误的点。为了保证稳定的排序,他说他需要总共,然后分开,所以<代码> No.<代码>中间不匹配。当然,代码> >由TCNT DESC,CNT DESC,名称< /代码>将提供更稳定的排序,但是OP不需要在其中,而且我看不出原因。在强制服务器执行额外工作时。感谢Akina,您的解决方案解决了问题。不幸的是,我需要使用laravel的查询生成器执行此操作,并且当我执行子查询时,参数替换错误:@J_J使用原始SQL。无论如何,您必须至少使用
select(db::raw
用于字段别名…@Akina很好的解决方案。但是,我会使用显式连接而不是自然连接。自然连接容易出错且模糊。+1另一个注意事项是,我会用tcnt DESC替换
ORDER,用tcnt DESC、name、cnt DESC替换
ORDER,以确保稳定的顺序。后者容易出错且在复杂的查询中可能是晦涩难懂的,但是这是一个简单的查询,没有错误的点。为了保证稳定的排序,他说他需要总共,然后分开,所以<代码> No.<代码>中间不匹配。当然,代码> >由TCNT DESC,CNT DESC,名称< /代码>将提供更稳定的排序,但是OP不需要在其中,而且我看不出原因。强制服务器做额外的工作。