【问题标题】:Use MySQL JOIN instead of a query in PHP While loop在 PHP While 循环中使用 MySQL JOIN 而不是查询
【发布时间】:2023-03-21 04:10:02
【问题描述】:

我正在尝试从 PHP while 循环中删除 mysql 查询并改用 JOIN。

我有一个问题

SELECT *, 
SUM(CASE WHEN posmonth like '2013%' THEN ext ELSE NULL END) AS year2013, 
SUM(CASE WHEN posmonth like '2012%' THEN ext ELSE NULL END) AS year2012, 
SUM(CASE WHEN posmonth like '2011%' THEN ext ELSE NULL END) AS year2011, 
SUM(CASE WHEN posmonth like '2010%' THEN ext ELSE NULL END) AS year2010 
FROM combined c 
LEFT JOIN customermaster cm ON c.alias=cm.customerkey 
WHERE cm.company LIKE 'A%' 
GROUP BY customerkey 
ORDER BY cm.company ASC 
LIMIT 0, 50

然后根据这些结果从另一个表“areamaster”中获取数据 使用:

    <?php 
$result = mysqli_query($link, $query);
   while ($r = mysqli_fetch_object($result)) {
    $alias = $r->alias;
    $company = $r->company;
    $a = mysqli_query($link, "SELECT area FROM areamaster WHERE areakey='$alias' LIMIT 1");
    while ($t = mysqli_fetch_object($a)) { $aliasdisplay = $t->area; }
    //Instead of this ^^ USE JOIN IN ORIGINAL QUERY
    ?>
    <tr>
         <td><?php print (substr($company,0,20)); ?></td>
         <td><?php print (strtoupper($r->location)); ?></td>
         <td><?php print $aliasdisplay; ?></td>
         <td>$<?php print number_format($r->$year4V,2,".",","); ?></td>
         <td>$<?php print number_format($r->$year3V,2,".",","); ?></td>
         <td>$<?php print number_format($r->$year2V,2,".",","); ?></td>
         <td>$<?php print number_format($r->$year1V,2,".",","); ?></td>
   </tr>
   <?php
   }
   mysqli_free_result($result);
    ?>

两个mysql表结构:

areamaster:
     areakey: Primary
     area: What I want displayed

combined:
     id:primary
     posmonth: for totaling ext by Year
     alias: compare to areamaster.areakey and get "areamaster.area"
     location: 
     ext: being totaled by SUM

如果有人可以帮助编写 JOIN,我将不胜感激。

另外,如果有任何进一步优化此查询的方法,请告诉我。

【问题讨论】:

  • 尝试YEAR(posmonth) 而不是匹配您正在执行的字符串。执行字符串版本会强制 mysql 将其内部日期/时间格式重新格式化为字符串,而不是直接戳该字段的本机结构内的年份位。当然,这假设 posmonth 是本地日期/时间字段。
  • 刚刚处理好了,谢谢 Marc

标签: php mysql loops optimization join


【解决方案1】:

这样试试

SELECT 
    *, 
    SUM(CASE WHEN posmonth like '2013%' THEN ext ELSE NULL END) AS year2013, 
    SUM(CASE WHEN posmonth like '2012%' THEN ext ELSE NULL END) AS year2012, 
    SUM(CASE WHEN posmonth like '2011%' THEN ext ELSE NULL END) AS year2011, 
    SUM(CASE WHEN posmonth like '2010%' THEN ext ELSE NULL END) AS year2010 
FROM combined c 
LEFT JOIN customermaster cm ON c.alias=cm.customerkey 
LEFT JOIN `areamaster` as a ON a.area = c.alias
WHERE cm.company LIKE 'A%' 
GROUP BY customerkey 
ORDER BY cm.company ASC 
LIMIT 0, 50

已编辑再试一次

【讨论】:

  • 感谢您的回复,该编辑给了我一个 SQL 语法错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 9 行的“FROM areamaster ON areakey = c.alias WHERE cm.company LIKE 'A%' GROUP BY cust”附近使用正确的语法
  • Raheel,我发现了我的问题,我是从错误的位置加入的,不过感谢您所做的一切。
猜你喜欢
  • 2014-10-18
  • 2013-10-27
  • 2013-03-11
  • 1970-01-01
  • 2012-09-05
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多