mysql查询效率从相似的组中提取不同的记录

mysql查询效率从相似的组中提取不同的记录,mysql,Mysql,我正在构建一个表,其中显示了多个记录包含相同的btc,但不同的客户名称的实例,还显示了每个客户的成本的最低实例 这个查询很有效,但效率很低,在80000行的表上运行需要一分钟,所以我觉得我一定是做错了什么 select btc,customer_name,min(cost) from table where table.btc in (select btc from table group by 1 having count(distinct customer_name) > 1)

我正在构建一个表,其中显示了多个记录包含相同的
btc
,但不同的
客户名称的实例,还显示了每个客户的
成本的最低实例

这个查询很有效,但效率很低,在80000行的表上运行需要一分钟,所以我觉得我一定是做错了什么

select btc,customer_name,min(cost) from table where table.btc in
 (select btc from table group by 1 having count(distinct customer_name) > 1) 
 group by 1,2
这将输出如下表:

+---------+---------------+---------+
|   btc   | customer_name |  cost   |
+---------+---------------+---------+
| asd32   | Sony          | 1.45863 |
| asd32   | Nintendo      | 1.84839 |
| bf33940 | Sony          | 2.49188 |
| bf33940 | Nintendo      | 2.49188 |
| a43c3f  | Sony          | 2.84142 |
| a43c3f  | Nintendo      | 2.45    |
| a43c3f  | Sega          | 2.689   |
+---------+---------------+---------+
select t1.btc, customer_name, min(cost)
from xxx t1
join (
  select btc
  from xxx
  group by btc
  having count(*) > 1
) t2 on t1.btc = t2.btc
group by t1.btc, t1.customer_name
我想更进一步,不包括
客户名称
字段的
成本
相同的任何结果(因此-从上表中删除btc
bf33940
,因为索尼和任天堂的成本相同)

我也想知道是否有一种更有效的方法来做我正在做的事情

表结构
此处的示例CSV文件:

您可以尝试将
中的where…替换为
加入
,尽管很难说 不用测试,它的效率会提高多少

大概是这样的:

+---------+---------------+---------+
|   btc   | customer_name |  cost   |
+---------+---------------+---------+
| asd32   | Sony          | 1.45863 |
| asd32   | Nintendo      | 1.84839 |
| bf33940 | Sony          | 2.49188 |
| bf33940 | Nintendo      | 2.49188 |
| a43c3f  | Sony          | 2.84142 |
| a43c3f  | Nintendo      | 2.45    |
| a43c3f  | Sega          | 2.689   |
+---------+---------------+---------+
select t1.btc, customer_name, min(cost)
from xxx t1
join (
  select btc
  from xxx
  group by btc
  having count(*) > 1
) t2 on t1.btc = t2.btc
group by t1.btc, t1.customer_name
对于第二个问题,您可以按btc和成本进一步分组以删除重复项:

select t3.btc, group_concat(t3.customer_name), min_cost
from (
   select t1.btc, t1.customer_name, min(cost) as min_cost
   from xxx t1
   join (
      select btc
      from xxx
      group by btc
      having count(distinct customer_name) > 1
   ) t2 on t1.btc = t2.btc
) t3
group by t1.btc, t1.cost
同样,如果没有测试,很难说这是否有效,但希望你能理解


为了加快速度,我将为每个btc创建一个单独的表,并为有多少客户创建一个计数器,这样您就不需要创建count()大于1的临时表。

您能给出表的结构吗?还有一些数据。谢谢!我正在收回t1.btc=t2.btc
t2上t2上的这些SQL语句的语法错误portion@BrianPowell是的,很明显这是一个打字错误,有一个“在t2上”额外:)我编辑了我的答案。正如我所说,它没有经过测试。我有时讨厌SQL。现在我得到了一个错误,
列btc是不明确的
,但我不确定我使用这个变量的50个实例中的哪一个是不明确的:)@BrianPowell我再次编辑了我的答案,试图澄清,但你是唯一能够完全调试查询的人。对我来说,在没有客户端的情况下盲目地编写SQL是不容易的。哦,这很好——我知道远程调试SQL非常困难。我感谢你在这里帮助我的时间!