用于多个和的MySQL子查询

用于多个和的MySQL子查询,mysql,performance,query-optimization,subquery,Mysql,Performance,Query Optimization,Subquery,如果我需要用相似的WHERE条件得到五个+不同的和值,那么通过一个查询和五个子查询是最好的(可能是唯一的)方法吗?例如,我的查询是: SELECT user, (SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 1 AND user = 1 AND date = x) AS one, (SELECT SUM(amount) FROM table t, table2 t2

如果我需要用相似的WHERE条件得到五个+不同的和值,那么通过一个查询和五个子查询是最好的(可能是唯一的)方法吗?例如,我的查询是:

SELECT user, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 1 AND user = 1 AND date = x) AS one,
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 2 AND user = 1 AND date = x) AS two, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 3 AND user = 1 AND date = x) AS three, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 4 AND user = 1 AND date = x) AS four, 
(SELECT SUM(amount) FROM table t, table2 t2 WHERE t.table2_id = t2.id AND table2.type = 5 AND user = 1 AND date = x) AS five 
FROM table 
WHERE user = 1
到目前为止,我的查询速度非常快,但我担心当有更多记录时,五个子查询的含义

出于好奇,像这样一个包含五个子查询的查询是否比五个单独的查询具有性能优势/劣势?我假设它更快,因为它只需要一次访问数据库,而不是5次


编辑:表2中有大约60条记录,用于对表1中的数千条记录进行分类。表2中的每条记录按类型值1-5进行分类(这是我用来对我想要的总和的项进行分组的)

只需一个查询即可获得每种类型的总和:

SELECT 
  t2.type, 
  SUM(t.amount) 
FROM 
  table t 
INNER JOIN 
  table2 t2 
ON 
  t.table2_id = t2.id 
AND 
  t.user = 1
AND 
  t.date = x 
GROUP BY 
  t2.type

您只需要一个查询即可获得每种类型的总和:

SELECT 
  t2.type, 
  SUM(t.amount) 
FROM 
  table t 
INNER JOIN 
  table2 t2 
ON 
  t.table2_id = t2.id 
AND 
  t.user = 1
AND 
  t.date = x 
GROUP BY 
  t2.type

嗯。如果这只针对一个用户,而您不一定需要按此顺序使用它…您可以这样做

select user, type, sum(amount)
where user = 1
and date = x
and type between (1,5)
group by user, type
这会给你

1,1,sum
1,2,sum
1,3,sum
1,4,sum
1,5,sum
而不是

1,sum1,sum2,sum3,sum4,sum5

这应该足够满足您的需要了,我想没有那么多麻烦。

好吧。如果这只针对一个用户,而您不一定需要按此顺序使用它…您可以这样做

select user, type, sum(amount)
where user = 1
and date = x
and type between (1,5)
group by user, type
这会给你

1,1,sum
1,2,sum
1,3,sum
1,4,sum
1,5,sum
而不是

1,sum1,sum2,sum3,sum4,sum5
这应该足够满足你的需要了,我想没有那么多麻烦

  • 使用ANSI连接
  • 最好像下面的查询那样以透视形式编写查询
  • 重写:

    SELECT t.user, 
    SUM(CASE table2.type WHEN 1 then amount else 0 end) As one,
    SUM(CASE table2.type WHEN 2 then amount else 0 end) As two,
    SUM(CASE table2.type WHEN 3 then amount else 0 end) As three,
    SUM(CASE table2.type WHEN 4 then amount else 0 end) As four,
    SUM(CASE table2.type WHEN 5 then amount else 0 end) As five
    FROM table t
    INNER JOIN table2 t2 ON t.table2_id = t2.id 
    WHERE t.user = 1
      AND table2.type in (1,2,3,4,5)
    
    我知道您的查询是伪查询,但它有一个挂起的
    WHERE user
    ,没有
    FROM
    子句。至于性能,上面的表格一次就完成了。5x子查询表单可能需要5次传递,但如果有合适的索引可用,则速度不会明显减慢

  • 使用ANSI连接
  • 最好像下面的查询那样以透视形式编写查询
  • 重写:

    SELECT t.user, 
    SUM(CASE table2.type WHEN 1 then amount else 0 end) As one,
    SUM(CASE table2.type WHEN 2 then amount else 0 end) As two,
    SUM(CASE table2.type WHEN 3 then amount else 0 end) As three,
    SUM(CASE table2.type WHEN 4 then amount else 0 end) As four,
    SUM(CASE table2.type WHEN 5 then amount else 0 end) As five
    FROM table t
    INNER JOIN table2 t2 ON t.table2_id = t2.id 
    WHERE t.user = 1
      AND table2.type in (1,2,3,4,5)
    

    我知道您的查询是伪查询,但它有一个挂起的
    WHERE user
    ,没有
    FROM
    子句。至于性能,上面的表格一次就完成了。5x子查询表单可能需要5次通过,但如果有合适的索引可用,速度应该不会太慢。

    谢谢Dan!对不起,当我问这个问题时,我过度简化了我的查询,并忽略了我要加入的第二个表的重要存在类型“”属于表2,而我得到的值之和属于表1。我在我的问题中的一次编辑中注意到了这一点。这并没有改变任何事情,仍然只是一个带有GROUP BY的查询,任何人都不应该要求这样做。SQL的目的是为应用程序检索数据,而不是将其格式化为某种特定的显示方式。
    任何人都不应该要求这是一条非常强的语句。有些报告引擎,如Crystal,需要将数据放在一行中。从行操作它有点不容易。这只是我想到的第一件事。谢谢丹!对不起,当我问这个问题时,我过度简化了我的查询,并忽略了我要加入的第二个表的重要存在类型“”属于表2,而我得到的值之和属于表1。我在我的问题中的一次编辑中注意到了这一点。这并没有改变任何事情,仍然只是一个带有GROUP BY的查询,任何人都不应该要求这样做。SQL的目的是为应用程序检索数据,而不是将其格式化为某种特定的显示方式。
    任何人都不应该要求这是一条非常强的语句。有些报告引擎,如Crystal,需要将数据放在一行中。从行操作它有点不容易。这只是我想到的第一件事。嘿,谢谢你,乔迪。这是有效的(并且在你发布这篇文章后,可以编辑我的问题)。你是对的,因为我是为一个用户做这件事的,这应该很好。我不知道为什么我没有想到它。再次感谢:)如果您为任意数量的用户或表中的所有用户执行此操作,则它将起作用。这就是他按用户和类型分组的原因。嘿,谢谢你,乔迪。这是有效的(并且在你发布这篇文章后,可以编辑我的问题)。你是对的,因为我是为一个用户做这件事的,这应该很好。我不知道为什么我没有想到它。再次感谢:)如果您为任意数量的用户或表中的所有用户执行此操作,则它将起作用。这就是他按用户和类型分组的原因。出于对[神名]的热爱,请在将来的问题中使用真实的表格和真实的数据。这种对真实情况的沉默实际上并不能让你更快地找到正确的答案。很多时候,它只会让你得到一个错误的答案,除了你自己,没有任何人的过错。是的,我注意到了。再次感谢您的时间和帮助。出于对[神名]的热爱,请在以后的问题中使用您的真实表格和真实数据。这种对真实情况的沉默实际上并不能让你更快地找到正确的答案。很多时候,它只会让你得到一个错误的答案,除了你自己,没有任何人的过错。是的,我注意到了。再次感谢您的时间和帮助。