0

我有以下代码...

<?php
$sql = 
    "SELECT 
         tickets.company, tickets.datetime, tickets.ticketnumber, 
         customer_notes.customer, customer_notes.timestamp, customer_notes.notes 
    FROM 
       tickets, customer_notes 
    WHERE tickets.company = '".$_GET["seq"]."' AND 
          customer_notes.customer = '".$_GET["seq"]."' 
    GROUP BY customer_notes.customer, tickets.company ";

    $rs=mysql_query($sql,$conn) or die(mysql_error());
    echo '<table width="100%" border="0" cellspacing="5" cellpadding="5">';
    while($result=mysql_fetch_array($rs))
    {
        echo '<tr>
                <td>'.$result["timestamp"].'</td>
                <td>'.$result["notes"].'</td>
              </tr>
              <tr>
                <td>'.$result["datetime"].'</td>
                <td>'.$result["ticketnumber"].'</td>
              </tr>';
    }
    echo '</table>';
    ?>

ticket 表和 customer_notes 表根本没有参考——它们是完全独立的。

当客户记录问题时,tickets 表用于支持票证,然后 customer_notes 表用于客户打电话时,通过电话谈论的所有内容都记录在此表中。

我试图让它按日期时间顺序显示门票表和客户备注表中的数据。

因此,如果创建了一张票,然后添加了一条注释,然后添加了另一条注释,那么他们将使用上面的代码按日期时间顺序显示一张票,但是它没有正确显示

4

5 回答 5

4

你的问题有点模糊,所以我会给你两个选择。

1)您有两个相似的表,并希望从两者中选择所有记录:(如果您想要两个表都有的列 A、B、C 中的所有数据)

如果表具有相似的结构(相同的列),则应使用union。联合从两个表中获取结果,并将它们组合成一个结果集。但是,两个表必须具有相同的结构(或者至少,如果整个结构不相同,则调用相似的字段)。

2)这些表有不同的列,您希望将它们合并到一些共同的属性上:(如果您想要第一个表中的 A、b 和 C 列,然后是第二个表中的 D、E 和 F 列。)

您应该使用主键/外键加入。最常见的连接是内连接,如果左表或右表不匹配,则忽略该记录。这完全取决于你想要做什么(你的问题有点含糊)

此外,您的代码极易受到 SQL 注入攻击

于 2013-03-05T16:38:46.050 回答
1

我认为您在这里要做的是获取带有客户备注的票证列表,在这种情况下,一个简单的左连接将起作用,尽管您可能需要在执行输出之前遍历整个列表:

我不确定您的客户备注与票据的确切关系,但我看到您在查询中使用的是公司,所以这就是不好的用途:

SELECT t.company, t.ticketnumber, t.datetime, t.ticketnumber, c.customer, c.timestamp, c.notes
FROM tickets t
LEFT JOIN customer_notes c ON (t.company = c.customer)
WHERE t.company = %s
ORDER BY t.company, t.datetime, t.ticketnumber, c.timestamp DESC

那么你可以这样做:

mysql_query(sprintf($theQueryFromAbove, mysql_real_escape_string($_GET['seq'])));

这将为您提供一个平坦的结果集 - 这意味着您将拥有多次票证数据,但它应该以丛集的形式排序,以便您将公司/票证编号的所有数据放在一组连续的行中,以便更容易准备输出.

于 2013-03-05T16:52:43.693 回答
1

我设法使用 UNION 解决了​​这个问题

$sql ="
    SELECT datetime as datetime2, CONCAT(CONCAT('<strong>Ticket</strong> - ', ticketnumber, '<br>'),summary) as displaydata from tickets where company = '".$_GET["seq"]."'
    UNION
    SELECT timestamp as datetime2, CONCAT('<strong>Note</strong><br>',notes) as displaydata from customer_notes where customer='".$_GET["seq"]."'
    order by datetime2 DESC ";
    $rs=mysql_query($sql,$conn) or die(mysql_error());
    echo '<table width="100%" border="0" cellspacing="5" cellpadding="5">';
    while($result=mysql_fetch_array($rs))
    {
        echo '<tr>
            <td width="150px" valign="top">'.$result["datetime2"].'</td>
            <td valign="top">'.nl2br($result["displaydata"]).'</td>
          </tr>';
}
echo '</table>';
于 2013-03-07T23:31:55.123 回答
0

下面的小改动可能更适合您。我相信如果没有两个表之间的关系,您可以获得表的笛卡尔积。

<?php
$sql = 
    "SELECT 
         tickets.company, tickets.datetime, tickets.ticketnumber, 
         customer_notes.timestamp, customer_notes.notes 
    FROM 
       tickets, customer_notes 
    WHERE tickets.company = customer_notes.customer AND 
          customer_notes.customer = '".$_GET["seq"]."' 
    GROUP BY tickets.company ";

    $rs=mysql_query($sql,$conn) or die(mysql_error());
    echo '<table width="100%" border="0" cellspacing="5" cellpadding="5">';
    while($result=mysql_fetch_array($rs))
    {
        echo '<tr>
                <td>'.$result["timestamp"].'</td>
                <td>'.$result["notes"].'</td>
              </tr>
              <tr>
                <td>'.$result["datetime"].'</td>
                <td>'.$result["ticketnumber"].'</td>
              </tr>';
    }
    echo '</table>';
    ?>
于 2013-03-05T16:52:30.720 回答
0

您要做的第一件事是更改 SQL 语句。您的表格之间的链接似乎是tickets.companyand customer_notes.customer (这个假设被证明是错误的,请参阅下面的编辑)。您现在可以更改 SQL 以使用 JOIN 链接两个表。我使用了 LEFT 连接,这样仍然会列出没有注释的票:

(为了提高可读性,以下代码示例只是 SQL,因此您必须将其括在 PHP 的引号中。)

SELECT tickets.company, tickets.datetime, tickets.ticketnumber, 
  customer_notes.timestamp, customer_notes.notes 
FROM tickets
LEFT JOIN customer_notes ON tickets.company=customer_notes.customer
ORDER BY tickets.datetime DESC, customer_notes.timestamp DESC

它按工单创建日期降序排列。所有笔记均按时间戳降序排列。这个选择的结果看起来有点像这样

company      datetime   ticketnumber timestamp        notes
ACME Corp    2013-01-12     2        20130113110034   firstnotetext
ACME Corp    2013-01-12     2        20130113140245   secondnotetext
Somecorp     2013-01-10     1

当您只想列出一家公司的票和票据时,您必须在 ORDER BY 子句之前插入一个 WHERE 子句,如下所示:

WHERE tickets.company = {put your escaped $_GET parameter here}

当您将参数放入 SQL 语句中的 $_GET['seq'] 参数时,请确保正确转义它以防止 SQL 注入:

$sql="WHERE tickets.company = '".mysql_real_escape_string($_GET['seq'])."'";

编辑:在评论中你说这两个表不相关。通常你只会使用两个 SELECT,但你想要一个按日期/时间排序的表。所以你必须使用一个 UNION:

SELECT company as name, datetime as t, ticketnumber as more_info
UNION
SELECT customer as name, timestamp as t, notes as more_info
ORDER BY t DESC

PS我实际上没有尝试过,但如果我没记错的话,您可以在订购时交换日期时间字段和时间戳,如果没有,只需使用它们将它们都转换为相同的日期/时间格式TIMESTAMP(datetime) as t

于 2013-03-05T16:54:04.347 回答