【问题标题】:SQL Question ... should I use a Group By?SQL 问题...我应该使用 Group By 吗?
【发布时间】:2010-01-01 00:53:14
【问题描述】:

我需要按投资组合名称对数据进行分组,然后对数据进行排序并显示复选框。这是表结构。

Table A
--------
portfolio_id
portfolio_name

Table B
-------
file_id
portfolio_id (Foreign Key fk_port_id references portfolio_id in table A)
file_name

基本上,表 A 以“一对多”的关系链接到表 B。

这就是我想要做的事情,几年前我能够使用informix 数据库完成它,但我不记得如何做到这一点,甚至不记得它是否可以使用MySQL。我正在使用 php 和 mysql。我想使用 SQL 将文件名(表 b)分组到它们各自的投资组合(表 A)下。

所以,对于我的输出,我希望它看起来像:

 **Portfolio 1**
      Jack's File
      Robyn's File
 **Portfolio 2**
      Joey's file
 **Portfolio 3**
      John's File

我是否可以使用一些 SQL 来对投资组合下的文件进行分组,然后允许我使用 PHP 循环遍历“GROUPS”并显示数据?

我尝试使用两个不同的循环,一个用于投资组合,然后在其中使用另一个循环通过执行“if”语句来获取所有文件,以比较它是否属于投资组合,但我更愿意找出我是否可以先从 MySQL 中取出来。

当我使用 Informix 时,我在 sql 中执行了 Group By 之类的操作,然后在 shell 脚本中我使用了 foreach“Group By Header”来获取“Group”的名称,然后使用了类似于“Group By数据”来显示属于标头的数据内容....显然我的informix语法不正确,...这是一个很棒的功能...我可以用MySQL或类似的东西来完成这个吗?

谢谢。

【问题讨论】:

    标签: php sql mysql group-by


    【解决方案1】:

    没有普通的 SQL 结构可以自然地为您做到这一点。我的建议是在标准语句中提取行:

    Portfolio 1, Jack's file
    Portfolio 1, Robyn's File
    Portfolio 2, Joey's file
    ...
    

    然后在代码中实现你想要的中断条件。在 PHP 中,这看起来像:

    ...
    $prevPortfolio = '';
    while ($row = mysql_fetch_assoc($query)) {
      $portfolio = $row['portfolio'];
      $file = $row['file'];
      if (prevPortfolio != $portfolio) {
        echo "**$portfolio**\n";
      }
      echo "  $file\n";
      $prevPortfolio = $portfolio;
    }
    

    【讨论】:

    • 这正是我在我们的 Java/MySQL 系统中所做的。效果很好。
    【解决方案2】:

    这不是 GROUP BY 的用途。

    GROUP BY 用于计算汇总(总和、平均值、计数等)

    您在表 A 和表 B 之间有一个普通的嵌套查询。

    【讨论】:

      【解决方案3】:

      根据您的描述,您似乎已经在做类似于其他答案中建议的事情,您可能缺少的是确保您以正确的顺序获得数据以允许你的 php 循环成功...

      SELECT
         [A].portfolio_name,
         [B].file_name
      FROM
         [A]
      INNER JOIN
         [B]
            ON [B].portfolio_id = [A].portfolio
      ORDER BY
         [A].portfolio_name,
         [B].file_name
      

      如果由于任何原因您的数据有重复,那么您可以使用 GROUP BY 来消除这些,或者您可以使用 DISTINCT,但我倾向于使用 GROUP BY...

      SELECT
         [A].portfolio_name,
         [B].file_name
      FROM
         [A]
      INNER JOIN
         [B]
            ON [B].portfolio_id = [A].portfolio
      GROUP BY
         [A].portfolio_name,
         [B].file_name
      ORDER BY
         [A].portfolio_name,
         [B].file_name
      

      【讨论】:

        【解决方案4】:

        只需选择所有数据元素并循环遍历每个portfolio_id。然后在PHP中使用比较逻辑输出portfolio_id和文件信息。

        SELECT a.portfolio_name, b.file_id, b.file_name 
        FROM a, b 
        WHERE a.portfolio_id = b.portfolio_id
        

        不需要 GROUP BY。

        【讨论】:

          【解决方案5】:

          感谢您的所有投入。我最终根据您的一些建议修改了我现有的循环,以使其正常工作。我真的不想做所有的代码,但正如你所指出的那样,这是在 php 中完成它的最佳方式。感谢您的帮助。

          【讨论】:

            猜你喜欢
            • 2010-12-18
            • 1970-01-01
            • 2018-05-13
            • 1970-01-01
            • 1970-01-01
            • 2016-02-22
            • 1970-01-01
            • 1970-01-01
            • 2018-09-07
            相关资源
            最近更新 更多