SQL问题......我应该使用Group By吗?

时间:2010-01-01 00:53:15

标签: php sql mysql group-by

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

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”的内容数据“显示属于Header的数据的内容....显然我的informix语法不正确,...这是一个很棒的功能......我能用MySQL完成这个,还是类似的东西?< / p>

感谢。

5 个答案:

答案 0 :(得分:6)

没有vanilla 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;
}

答案 1 :(得分:3)

这不是GROUP BY的用途。

GROUP BY用于计算摘要(总和,平均值,计数等)

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

答案 2 :(得分:1)

根据您的描述,您似乎已经在做了类似于其他答案中建议的内容,可能缺少的内容是确保您以正确的顺序拥有数据以允许你的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

答案 3 :(得分:0)

只需选择所有数据元素并循环浏览每个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。

答案 4 :(得分:0)

感谢所有输入人员。我最后修改了我现有的循环,并提出了一些建议,以使其正常工作。我真的不想做所有的代码,但正如你已经指出那是php完成它的最好方法。谢谢你的帮助。