【问题标题】:Display data from SQL database as a topology将 SQL 数据库中的数据显示为拓扑
【发布时间】:2016-02-01 21:55:20
【问题描述】:

我有以下情况:

Site_A   Link_AB   Site_B    Link_BC   Site_C
001      001-002   002       002-003   003
001      001-002   002       002-004   004
001      001-005   005       005-006   006

我想将其显示为:

001      001-002   002       002-003   003
                             002-004   004
         001-005   005       005-006   006

有没有可能?

谢谢

【问题讨论】:

  • 哪个数据库引擎?您是否使用编程上下文(PHP?ASP?ColdFusion,Java...)?
  • 嗨,是的.. 抱歉没有说明这一点。我正在使用 php 和 mysql。

标签: php mysql sql


【解决方案1】:

您可以在 PHP 中执行此操作,并使 SQL 简单而标准:

$query = "SELECT   Site_A, Link_AB, Site_B, Link_BC, Site_C 
          FROM     sitelinks
          ORDER BY 1, 2, 3, 4, 5";
$result = $mysqli->query($query) or die($mysqli->error());

// maintain an array with previous values
$previous = array();
echo "<table border=1>";
while ($row = $result->fetch_assoc()) {
    if (!count($previous)) {
        // display column headers
        echo "<tr>";
        foreach($row as $key => $value) {
            echo "<th>" . htmlentities($key) . "</th>";
        }
        echo "</tr>";
        // initialise $previous with empty values for each column:
        $previous = array_fill_keys(array_keys($row), '');
    }
    echo "<tr>";
    foreach($row as $key => $value) {
        // display value only when different from previous for this column:
        echo "<td>".($value !== $previous[$key] ? htmlentities($value) : '')."</td>";
    }
    // copy current values into $previous
    $previous = $row;
    echo "</tr>";
}
echo "</table>";

输出:

【讨论】:

  • 非常感谢。这实际上是我现在正在做的事情,将前一行保留在一个数组中,但你的代码更干净:)。谢谢
【解决方案2】:

虽然在 MySQL 中可能,但这种类型的处理通常在表示层中完成。为什么?结果集的含义完全取决于行的顺序,SQL 通常使用无序集。

所以,如果你有一个返回表的查询,你可以做一些事情。可能最简单的方法使用变量:

select if(@sa = Site_A, '', if(@sa := Site_A, @sa, @sa)) as Site_A,
       if(@l = Link_AB, '', if(@l := Link_AB, @l, @l)) as Link_AB,
       if(@sb = Site_B, '', if(@sb := Site_B, @sb, @sb)) as SIte_B,
       Link_BC, Site_C
from t cross join
     (select @sa := '', @l := '', @sb := '') params
order by t.Site_A, t.Link_AB, t.Site_B;

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多