繁体   English   中英

PHP MySQL从2个不同的表中选择*,并按两个表中的datetime列显示混合在一起的数据

[英]PHP MySQL Select * from 2 different tables and display the data mixed together ordered by datetime column in both tables

我有以下代码...

<?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>';
    ?>

票证表和customer_notes表根本没有引用,它们是完全独立的。

票证表用于客户遇到问题时的支持票证,而customer_notes表则用于当客户打电话时将通过电话交谈的所有内容记录在该表中。

我试图使其以日期时间顺序显示票证表和客户注释表中的数据。

因此,如果创建了票证,则添加了一个便笺,然后又添加了另一个便笺,然后它们将使用上述代码按日期时间顺序显示,但未正确显示

您的问题有点含糊,所以我给您两个选择。

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

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

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

您应该使用主/外键加入 最常见的联接是内部联接,它表示如果左表或右表不匹配,则忽略该记录。 这完全取决于您要执行的操作(您的问题有点含糊)

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

我认为您要在此处执行的操作是获取带有客户注释的票证列表,在这种情况下,可以进行简单的左连接,尽管您可能需要在遍历整个列表之前进行输出:

我不确定您的客户备忘与确切的报价单有何关系,但我在查询中看到您正在使用公司,因此使用不便:

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'])));

这将为您提供一个统一的结果集-意味着您将多次获得票证数据,但应以成批的顺序订购,这样您就可以在连续的行集中拥有公司/票证号的所有数据,因此更易于准备输出。

我设法使用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>';

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

<?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>';
    ?>

您要做的第一件事是更改SQL语句。 您的表之间的链接似乎是tickets.companycustomer_notes.customer (这种假设被证明是错误的,请参见下面的Edit) 现在,您可以更改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}

将参数放入$ _GET ['seq']参数放入SQL语句时,请确保正确地对其进行转义以防止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将它们都转换为相同的日期/时间格式TIMESTAMP(datetime) as t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM