Php在一个请求中加入多行,并带有日期时间戳

时间:2017-04-28 15:17:53

标签: php sql-server datetime

我不是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

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

1 个答案:

答案 0 :(得分:0)

您已在问题中提及了代码字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。