【问题标题】:mySQL, PHP, HTML table with sortable columns - but issue with some column values带有可排序列的 mySQL、PHP、HTML 表 - 但某些列值存在问题
【发布时间】:2013-10-12 00:54:38
【问题描述】:

我有一个 mySQL 数据库表,其列如下:

项目

  • item_id
  • 姓名
  • 大小(例如,以字节为单位)
  • 说明
  • 日期

还有另一个表,它与第一个表具有 1:* 关系,其中包含描述由第一个表中的字段表示的项目的“关键字”:

Item_Keyword

  • item_id
  • 关键字

我使用 PHP 从 Item 表中“选择 *”,然后遍历返回的行(使用带有 fetch_assoc() 的 while 循环)来构建一个包含所有数据的 HTML 表。

在 while 循环的每次迭代中,我对 Item_Keyword 表中与 Item 表中当前元组的 id 匹配的所有关键字执行另一个查询,然后将它们添加到表中的列, 连接在一起:

$res = getItems();
if ($res)
{
  while ($row = $res->fetch_assoc())
  {
    ...
    $itemID = $row['item_id];
    $res2 = getKeywords($itemID);
    if ($res2)
    {
      $keywords = "";
      while ($row2 = $res2->fetch_assoc())
      {
        if (strlen($keywords) > 0)
          $keywords .= ", ";
        $keywords .= $row2['keyword'];
      }
      $text .= "<td> " . $keywords . " </td>";
     }
   }
}

所以我最终得到了一个看起来像这样的表格:

ID  Name    Size  Description  Date    Keywords
0   Widget  1024  Widget one   010101  widget,one,item

我正在尝试使 HTML 表格列可排序。我可以设想如何在我对 Item 表的查询中使用 ORDER BY。问题是,由于关键字存储在单独的表中并通过独立查询检索,我只能 ORDER BY 一组查询结果或另一组,但不能同时排序 - 更简洁的是,我看不到任何排序方式按关键字列中的值。

是否有某种我可以构造的深奥查询允许我选择项目的关键字,并将这些包含在项目表上查询的“FROM”参数中?比如:

SELECT item_id, name, size, description, date (SELECT keyword FROM Item_Keyword WHERE item_id = 0)
FROM Item
WHERE item_id = 0

【问题讨论】:

标签: php html mysql sorting html-table


【解决方案1】:

首先,您可能应该使用这样的单个查询来获取所有数据:

SELECT
  i.item_id AS `item_id`,
  i.name AS `name`,
  i.size AS `size`,
  i.description AS `description`,
  i.date AS `date`,
  GROUP_CONCAT(ik.keyword) AS `keywords`
FROM item AS i
LEFT JOIN item_keyword AS ik
  ON item.item_id = item_keyword.item_id
GROUP BY i.item_id
ORDER BY i.item_id ASC, ik.keyword ASC /* OR whatever sort you desire */

请注意,我使用 GROUP_CONCAT()GROUP BY 子句将所有关键字条目折叠到与每个 item_id 关联的单行中。

这可以在单个数据库调用中为您提供所需的一切,消除所有那些不必要的额外查询。您也可以在没有 group by 的情况下执行此操作,您只会有更多行(即具有 3 个关键字的项目将产生 3 行)。使用这种方法,您可以在呈现表格之前将数据读入多维数组。

【讨论】:

  • 这太棒了,非常感谢您分享您的知识。我从来没有在查询写作方面超越“绝对初学者”,你的例子展示了更高级学习的力量。非常感谢。
  • @AMarch 没问题。请意识到,如果将来您看到自己在这样的循环中查询数据库,这可能表明一种反模式,最好通过修改检索数据的方法来处理。
猜你喜欢
  • 2020-02-12
  • 2011-01-08
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
相关资源
最近更新 更多