我的情况是我需要按产品组合名称对数据进行分组,然后对数据进行排序并显示复选框。这是表结构。
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>
感谢。
答案 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完成它的最好方法。谢谢你的帮助。