PHP MySQL从2个不同的表中选择*,并在两个表中显示按日期时间列排序的数据

时间:2013-03-05 16:36:12

标签: php mysql database

我有以下代码......

<?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表,通过电话记录的所有内容都记录在此表中。

我试图让它以日期时间顺序显示票证表和客户票据表中的数据。

因此,如果创建了故障单,则添加了一个备注,然后添加了另一个备注,然后是使用上述代码以日期时间顺序显示的故障单,但它没有正确显示

5 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 1 :(得分: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'])));

这将为您提供一个平坦的结果集 - 这意味着您将多次获得票证数据,但它应该以团块形式订购,因此您将在一组连续的行中获得公司/票证编号的所有数据,因此更容易准备输出。

答案 2 :(得分: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>';

答案 3 :(得分: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>';
    ?>

答案 4 :(得分:0)

您要做的第一件事是更改SQL语句。您的表格之间的链接似乎是tickets.companycustomer_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}

当您将参数放入$ _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

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