使用PHP对MYSQL结果进行排序,以创建类似类别的结果

时间:2014-01-01 17:58:35

标签: php mysql

之前我曾问过[类似的问题] [1],以为我得到了答案,但看起来我被卡住了......

我为保险目的创建了一个漫画列表。基本上,它列出了我的所有问题,包括封面,标题,价值等几个领域。

现在,我在MYSQL中创建了两个表:comicstitles和漫画。

在漫画中,我有titID,titPrefix,titTitle和titType(例如:1,The,X-Men,Mini Serie)。

在漫画中,我有comID,comTitle,comVolume,comIssue,comValue,comImgMain等(例如:1,1,1,141,125,DaysOfFuturePast.jpg)。

我可以在comID = comTitle的表上进行左连接,这样我就可以在php中输出类似的内容:

The X-Men
(IMAGE)
Volume: 1
Issue: 142
Value: $125,00

现在,所有这一切都很好,但我想按标题对它们进行排序。

所以,而不是这个:

Alpha Flight
(IMAGE)
Volume: 1
Issue: 1
Value: $4,00

Alpha Flight
(IMAGE)
Volume: 1
Issue: 2
Value: $3,00

The X-Men
(IMAGE)
Volume: 1
Issue: 15
Value: $800,00

The X-Men
(IMAGE)
Volume: 1
Issue: 141
Value: $125,00

The X-Men
(IMAGE)
Volume: 1
Issue: 142
Value: $125,00

我想得到这个:

Alpha Flight
(IMAGE)
Volume: 1
Issue: 1
Value: $4,00

(IMAGE)
Volume: 1
Issue: 2
Value: $3,00

The X-Men
(IMAGE)
Volume: 1
Issue: 15
Value: $800,00

(IMAGE)
Volume: 1
Issue: 141
Value: $125,00

(IMAGE)
Volume: 1
Issue: 142
Value: $125,00

一个完美的例子就是按类别分类的Wordpress页面,其中列出了每个类别列表下具有单独帖子的所有类别。

谢谢!祝大家新年快乐:)

编辑: 这是我的疑问:

$result = mysqli_query($con,"SELECT * FROM comics, comicstitles WHERE comics.comTitle = comicstitles.titID ORDER BY comicstitles.titTitle ASC, comics.comIssue ASC");

这给了我一个很好的单级列表,如下所示:

The X-Men, Issue 15, valued at $800
The X-Men, Issue 141, valued at $125
The X-Men, Issue 142, valued at $125
Alpha Flight, Issue 1, valued at $4
Alpha Flight, Issue 2, valued at $3

但我想要,而不是:

The X-Men:
   Issue 15, valued at $800
   Issue 141, valued at $125
   Issue 142, valued at $125
Alpha Flight
   Issue 1, valued at $4
   Issue 2, valued at $3

我还需要用漂亮,干净的HTML包装它,所以IDEAL的事情就是能够做到这一点:

<h2>$comicTitle</h2>
   <ul>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
   </ul>

<h2>$comicTitle</h2>
   <ul>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
      <li>$comicIssue</li>
   </ul>

2 个答案:

答案 0 :(得分:0)

解决此类问题的一种简单方法是将标题保存在临时变量中,并仅在标题不同时打印标题。

$oldtitle = NULL;
while ($row = mysql_fetch_array($result)) {
    $prefix = empty($row['titPrefix']) ? '' : "{$row['titPrefix']} ";
    $title = $prefix . $row['titTitle'];
    if ($oldtitle != $title) {
       if ($oldtitle !== NULL) echo '</ul>';
       echo '<h1>'.htmlspecialchars($title).'</h1><ul>';
       $oldtitle = $title;
    }

    echo '<li><img src="'.$row['comImgMain'].'"/> '.
         ' Volume: '.$row['comVolume'] .
         ' Issue: '.$row['comIssue'] .
         ' Value: '.$row['comValue'] . '</li>';
}
if ($oldtitle !== NULL) echo '</ul>';

答案 1 :(得分:0)

这需要使用PHP而不仅仅是MySQL

首先,如果尚未正确排序,请将<{1}}添加到您的查询中

第二,用PHP形成一个多维数组:

ORDER BY titTitle, ...

然后当你将它们打印到页面上时,使用PHP类似于:

$comics_array = array();
while ($row = mysql_fetch_array($result)) {
    $comics_array[$row["titTitle"]][] = array(
        "comImgMain" => $row["comImgMain"],
        "comVolume" => $row["comVolume"],
        "comIssue" => $row["comIssue"],
        ...
    );
}