【问题标题】:Showing multiple fields associated with same row显示与同一行关联的多个字段
【发布时间】:2014-08-20 06:17:21
【问题描述】:

我有很多表 INNER JOIN(ing) 正在处理这个,我已经弄清楚了那部分。基本上,我会显示某些信息有限的紧急呼叫,以便公众可以看到他们所在地区正在发生的事情。我最近决定将单元与工单表进行 INNER JOIN,以便人们可以查看分配给某些呼叫的单元以及呼叫的状态。

我把电话放在一张桌子上。每一行都是一个不同的调用。添加单元时遇到的问题是,如果呼叫有多个单元,即使将两行中的两个单元分配给同一个呼叫,它也会为每个单元显示不同的行。示例:

救护车 1 - 呼吸困难 - 呼叫# 1013 引擎 1 - 呼吸困难 - 呼叫# 1013 救护车 2 - 电梯辅助 - 呼叫# 1012 引擎 2 - 提升辅助 - 呼叫# 1012

我想在一行中列出所有涉及的单元,因此呼叫信息只显示一次。示例:

救护车 1,引擎 1 - 呼吸困难 - 呼叫# 1013 救护车 2,引擎 2 - 电梯辅助 - 呼叫#1012

我已经尝试使用一些教程中的 GROUP_CONCAT 和 GROUP BY 方法。这可以使每个呼叫只显示一次,但它也只为每个呼叫显示一个单位,无论是否为该呼叫分配了超过 1 个单位。

我认为这里的一个大问题在于,我在这段代码中在 INNER JOIN(ing) 多个表之间有很多信息,但为了显示单位名称,这一切都是完全必要的(救护车 1),而不仅仅是代表该单位的 ID 号 (41)。

我正在使用的基本表在下面进行了编码,没有使用 GROUP_CONCAT 或任何 GROUP 方法。 非常感谢任何能够提供任何建议的人,因为这真的让我迷失了!

<table cellspacing=10>
    <tr>
        <th align="left">
            <u>Assigned Units-Status</u>
        </th>
        <th align="left">
            <u>City/Area</u>
        </th>
        <th align="left">
            <u>Call Date/Time</u>
        </th>
        <th align="left">
            <u>Call Description</u>
        </th>
     </tr>

<?php
    // Connect to database server
    mysql_connect("host", "db", "pass") or die (mysql_error ());

    // Select database
    mysql_select_db("dbname") or die(mysql_error());

    // SQL query
    $query="SELECT 911dbticket.id, 911dbticket.city, 911dbticket.problemstart, 911dbticket.description, 911dbassigns.ticket_id, 911dbassigns.responder_id, 911dbassigns.status_id, 911dbassigns.dispatched, 911dbassigns.responding, 911dbassigns.on_scene, 911dbassigns.clear, 911dbresponder.name
    FROM 911dbticket
    INNER JOIN 911dbassigns ON 911dbticket.id=911dbassigns.ticket_id
    INNER JOIN 911dbresponder ON 911dbassigns.responder_id=911dbresponder.id
    INNER JOIN 911dbun_status ON 911dbassigns.status_id=911dbun_status.id
    WHERE `status` !='1' AND `in_types_id` NOT IN ('3', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14') 
    ORDER BY problemstart DESC";

    // Execute the query (the recordset $rs contains the result)
    $rs = mysql_query($query);

    // Loop the recordset $rs
    // Each row will be made into an array ($row) using mysql_fetch_array
    while($row = mysql_fetch_array($rs)) {
        echo "<tr><td><font color=orange>".$row['name']."</font></td><td><font color=green>".$row['city']." </font></td><td><font color=green> ".$row['problemstart']."</font></td><td width=500><font color=green><i>".$row['description']."</i></font></td></tr>";

    }

    // Close the database connection
    mysql_close();
?>

【问题讨论】:

  • 我们可以看看输出的例子吗?奥卡姆剃刀会建议查询是错误的,如果您的查询返回相同值的倍数,那么这是一个很好的起点。
  • 您能否仅展示表、查询和数据库输出的示例? HTML 不太可能是相关的。
  • 当然可以。我将把这个电话留在黑板上一段时间,这样你就可以看到发生了什么。可能会添加其他调用。现在,您可以看到有两个单元分配给同一个呼叫。如果它在同一行中列出两个单元会更好,这样调用只会显示一次:compellingproductions.com/911/testarea.php
  • 我不知道是否值得注意,我使用上面的脚本只是为了调用和显示我包含在其中的有限信息。添加/修改/删除调用/单位/等的脚本。是一个非常复杂的脚本,涉及到 BUNCH 更多的表,但这不适合公众,我只是想向公众展示一些有关活动呼叫的基本信息。
  • 非常感谢那些建议修改我的代码的人!我总是倾向于编写非常长的代码行,实际上我不知道我可以像在“WHERE”子句中那样压缩它。至于我的桌子……嗯,它们总是很草率,所以也要感谢你的清理工作!你们都摇滚!非常感谢您的宝贵时间!

标签: php mysql group-concat


【解决方案1】:

想通了。我不知道“GROUP_CONCAT”必须包含在这样的行结果中:

$row['GROUP_CONCAT(name)']

而不是简单地:

$row['name']

我正在做更多研究并查看更多示例和教程,我在回声中看到了这一点并尝试了它。我很高兴看到“救护车 1,引擎 1”在一排的同一个呼叫旁边!哈哈

非常感谢大家抽出时间来查看并帮助我!对此,我真的非常感激!希望这篇文章能帮助其他可能遇到此问题的人。

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2011-01-30
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多