我不是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
我不知道我是否足够清楚,但我甚至不知道我想要的是否可能。任何帮助将不胜感激
答案 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。