【问题标题】:Php join multiple row in one request with date time stampphp在一个请求中加入多行,带有日期时间戳
【发布时间】:2017-04-28 15:17:52
【问题描述】:

我不是 mysql 专家,所以请原谅我的问题很简单。 我有一张这样的桌子:

ID - NODE - ORIGIN - VALUE - DATETIME

1 - 11 -  P1 - 2031 - 2017-01-01 20:15:17

2 - 11 -  P2 - 2531 - 2017-01-01 20:15:17

3 - 11 -  P3 - 2731 - 2017-01-01 20:15:17

4 - 11 -  P4 - 2031 - 2017-01-01 20:15:17

5 - 11 -  P1 - 2831 - 2017-01-01 20:30:17

6 - 11 -  P2 - 2917 - 2017-01-01 20:30:17

7 - 11 -  P3 - 2631 - 2017-01-01 20:30:17

8 - 11 -  P4 - 2031 - 2017-01-01 20:30:17

我的要求是这样的:

SELECT * 
FROM data 
WHERE NODE = '$nodeid'
AND ORIGIN = 'P1'
AND DATETIME BETWEEN '$start' and '$end'
ORDER BY DATETIME
LIMIT 1000

我收到一个表格,其中包含 $start$end 之间的所有结果,其来源为 P1

问题是我正在尝试绘制一个看起来像这样的 HTML 表格

Date /time  - P1 - P2 - P3 - P4

2017-01-01 20:15:17 - 2031 - 2531 - 2731 2031
2017-01-01 20:30:17 - 2831 - 2917 - 2631 2031

我不知道我是否足够清楚,但我什至不知道我想要的是否可能。任何帮助将不胜感激

【问题讨论】:

    标签: php sql-server datetime


    【解决方案1】:

    您已经在问题中提到了代码字JOIN。一旦掌握了窍门,像下面这样的查询就不难写了。

    在您的情况下,您希望将表连接到自身。这称为自联接,但它的工作方式与任何其他联接没有任何不同。你只需要确保你的表有不同的别名:

    SELECT d1.`DATETIME`, d1.value P1, d2.value P2, d3.value P3, d4.value P4
    FROM data d1
    LEFT JOIN data d2 ON d2.`DATETIME` = d1.`DATETIME` AND d2.ORIGIN = 'P2'
    LEFT JOIN data d3 ON d3.`DATETIME` = d1.`DATETIME` AND d3.ORIGIN = 'P3'
    LEFT JOIN data d4 ON d4.`DATETIME` = d1.`DATETIME` AND d4.ORIGIN = 'P4'
    WHERE 
        d1.ORIGIN = 'P1' AND
        NODE = '$nodeid' AND
        DATETIME BETWEEN '$start' and '$end'
    ORDER BY DATETIME
    LIMIT 1000
    

    我转义了字段名称DATETIME 以确保它可以正常工作,因为它既是函数名称又是数据类型名称。它不是关键字,所以它可能工作得很好(我还没有测试过),但如果有蜱虫,它肯定可以工作。
    最好不要在架构中使用 SQL 特定的词,这样您就不必担心这样的事情。

    最后一点:我希望您至少在创建查询之前转义变量。
    否则,您的代码很容易受到 SQL 注入的攻击。 阅读this answer,了解如何将值从 PHP 传递到 SQL。

    【讨论】:

    • 好吧,我不确定我是否理解你所说的“转义”(我对 php 和 mysql 一无所知,对我来说真的是全新的)。我必须搜索那个
    • 但是可以说,我的表是由 device_ts (设备时间戳)而不是 DATETIME 组成的
    • 由于您问题中的请求似乎有效,您可以将` 周围的勾号DATETIME 去掉。关于第一条评论:逃脱的确切方式取决于您的设置。希望您不要使用mysql_ 之类的mysql_connectmysql_query 函数。这些太旧了,甚至在现代版本的 PHP 中都不存在。请阅读我发布的链接中的问题和答案。
    • @Pharaoh,如果您在返回的列中添加别名(例如d1.value P1, d2.value P2),可能对 OP 有利,以防他在 PHP 中使用 assoc 数组。
    • 好主意。如果您编辑了答案,我不会生气;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多