【问题标题】:how to avoid sub query on mysql query如何避免对mysql查询的子查询
【发布时间】:2017-04-24 22:29:54
【问题描述】:

有4张桌子

team
---------------
id | teamname |
1  | lal      |
2  | sobuj    |

member
-----------------------
id | membername| team |
1  | sagor     | 1    |
2  | sumon     | 1    |

dps
---------------------------------------------------
id | member| team | deposit | refund | ddate      |
1  | 1     | 1    | 100     | 12     | 2016-09-01 |
2  | 2     | 1    | 120     | 34     | 2016-09-01 |
3  | 1     | 1    | 130     | 22     | 2016-09-01 |
4  | 3     | 1    | 120     | 0      | 2016-09-01 |

mvs
----------------------------------------------------
id | member| team | mvs_total| refund | ddate      |
1  | 1     | 1    | 100      | 12     | 2016-09-01 |
2  | 2     | 1    | 120      | 34     | 2016-09-01 |
3  | 1     | 1    | 130      | 22     | 2016-09-01 |
4  | 3     | 1    | 120      | 0      | 2016-09-01 |

这是我的查询:

$result=mysql_query(select * from member where team='1');
$row=mysql_fetch_array($result);
do{
    $aresult=mysql_query(select sum(deposit)-sum(refund)as balance from dps where member='$row[id]');
    $arow=mysql_fetch_array($aresult);
    echo $arow[balance];

    $bresult=mysql_query(select sum(mvs_total)as mvs_balance from mvs where member='$row[id]' and date1<='2016-09-01');
    $brow=mysql_fetch_array($bresult);
    echo $brow[mvs_total];

} while($row=mysql_fetch_array($result));

如何避免子查询或如何节省时间建议请提前感谢。

【问题讨论】:

  • 我在这里没有看到任何子查询
  • mysql 已弃用,请使用 PDO 或 mysqli
  • 实际上我想避免循环查询我想使用像SELECT member.mname, member.fn, loan.member, sum( loan.deposit ) - sum( loan.withdraw ) AS balance, sum( loan.deposit2 ) - sum( loan.withdraw2 ) AS balance2, sum( loan.total ) - sum( loan.lpay ) AS outsstanding FROM loan JOIN member ON ( loan.member = member.id ) WHERE loan.team = '10' AND loan.cs = 'Core' GROUP BY member这样的连接
  • 您在第一个查询中为每一行执行 2 次查询,当然这会花费太多时间。尝试使用group by
  • 你应该使用join来避免子查询。尝试在表之间建立关系并使用连接语句从差异表中获取数据。更多信息请参考以下链接:http://www.w3schools.com/sql/sql_join.asp

标签: php mysql select join


【解决方案1】:

我在您的表结构中注意到的第一件事是列重复
例如。 dpsmcs 表中不需要 team 列,因为从 member[连接到 member 表]你可以很容易的找到dps或者mvs在哪个队伍下。

对于您当前的问题,您可以使用以下查询。

    SELECT member.id, 
       member.membername, 
       Sum(dps.deposit) - Sum(dps.refund)       AS balance, 
       Sum(mvs.mvs_total)                       AS mvs_balance, 
       Sum(loan.deposit) - Sum(loan.withdraw)   AS balance, 
       Sum(loan.deposit2) - Sum(loan.withdraw2) AS balance2, 
       Sum(loan.total) - Sum(loan.lpay)         AS outsstanding 
FROM   member AS member 
       LEFT JOIN dps AS dps 
              ON dps.member = member.id 
       LEFT JOIN mvs AS mvs 
              ON mvs.member = member.id 
       LEFT JOIN loan AS loan 
              ON loan.member = member.id 
       WHERE  member.team = 1 
       AND mvs.ddate <= '2016-09-01' 
       -- AND loan.team = '10'  
       -- AND loan.cs = 'Core' 
GROUP  BY member.id  

【讨论】:

  • 您好,您的回答是正确的,但我想按成员查看分组,我正在按贷款成员添加分组,但它不起作用
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多