【问题标题】:how to correctly group/sort a mysql table如何正确对mysql表进行分组/排序
【发布时间】:2010-11-27 21:51:38
【问题描述】:

我需要一些帮助来理解一些“下一级”mysql/php 命令,而不仅仅是简单的查询语句和遍历数组。

我有一个表格,其中包含不同教员撰写的出版物。它们都存储在一起,并且有一个 Faculty_id 列,它告诉我哪个出版物属于哪个教员。在“生物”网页上,我想检索这些出版物……没问题吧?我遇到的问题是如何显示它们:按以年份为标题的“年份”列分组。因此,例如,输出将如下所示:

2010

  • 出版物 1
  • 出版物 2

2009

  • 出版物 1
  • 出版物 2

2007 // 假设 2008 年没有酒吧

  • 出版物 1
  • ...等

这是我开始的地方,我还能做些什么来提高效率?或者有没有办法使用 PHP 从下面的这个查询中创建一个多维数组?

"SELECT bibliography,year,link,position FROM faculty_pubs WHERE faculty_id='$faculty_id' AND status=1 ORDER BY year DESC, position ASC"

【问题讨论】:

  • 我应该提到表中有一个名为“id”的主键,但它没有在任何地方使用,所以我没有费心将它包含在查询中。对于任何感兴趣的人,“链接”将是某处在线出版物的 URL(如果存在),“状态”是一个 1/0 值,允许教员从他们的列表中“隐藏”出版物,以及“位置”是一个 jQuery 可排序功能,可让他们随意排列发布列表(而不是按“id”或标题)

标签: php mysql


【解决方案1】:

看起来你不需要按任何东西分组。您可以通过查看 MySQL 结果在 php 中创建基于年份的出版物数组。没有测试一点,但我希望你能明白这一点。您也可以像 Marc B 展示的那样在查询解析中执行此操作...这可能会更好,具体取决于我们正在讨论的出版物数量。

$publications = array();
$q = mysql_query("SELECT `bibliography`,`year`,`link`,`position` FROM `faculty_pubs` WHERE `faculty_id`='$faculty_id' AND `status`=1 ORDER BY `year` DESC, `position` ASC");
while($r = mysql_fetch_assoc($q)) {
 // separate publication out by year
 $publications[$r['year']][] = $r;
}

// no need to sort the array since all the results were put in order by the SQL sorting
foreach($publications as $year => $pub) {
 echo '<p>'.$year.'</p>';
 echo '<ul>';
 foreach($pub as $p) {
  echo '<li><a href="'.$p['link'].'">Publication title or position here</a></li>';
 }
 echo '</ul>';
}

【讨论】:

  • 谢谢,亚伦。 PS - 我会使用 do/while 循环而不是 while(),因为后者倾向于跳过第 0 行。
  • Stephan - 我从来没有一段时间()跳过第零行。 do/while 可以工作,但您正在做额外的工作以确保在第一次迭代中存在值。 while() 确保某些内容存在并且不会跳过行。
  • 嗯,我已经在各种网站上读到过这个问题,但假设这可能是问题所在(第一次迭代中没有值)。无论哪种方式,再次感谢您的帮助,我需要看到它才有意义。
【解决方案2】:

如果您将其存储在单个平面表中,那么按年份显示它们纯粹是一个“显示”问题。您的查询会输出如下所示的结果:

| bibliography | year | link       | position |
-----------------------------------------------
| blah blah    | 2008 | http://... | ???      |
| blah blah    | 2009 | http://... | ???      |
| blah blah    | 2009 | http://... | ???      |
| blah blah    | 2010 | http://... | ???      |
etc...

您只需遍历结果,跟踪年份,每当出现新的年份记录时,执行您需要的任何格式(新

    、新表等...)。
$previous_year = null;
while($row = mysql_fetch_assoc()) {
     if ($previous_year != $row['year']) {
         // start a new year
     }
     ... display publication
     $previous_year = $row['year']
}

【讨论】:

  • 谢谢!对于这个特定的网页,我想你是对的,因为它是我可以在显示端轻松操作的东西。但是,如果知道如何以一种可以获取我的数据集并将其重新组织到这些组中的方式来处理这个问题,将会非常有帮助。
  • SQL 用于检索数据,而不是格式化数据。正确层中的正确问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多