Mysql 创建一个视图,其中来自同一列的两条记录位于同一行上

Mysql 创建一个视图,其中来自同一列的两条记录位于同一行上,mysql,Mysql,首先,我是新来的,所以请通知我在提问时是否可以做得更好/与众不同 我在MySQL数据库中有一个表,如下所示: ID Time Object 1 10:00:05 1021 2 10:00:10 1021 3 10:00:15 1021 4 10:00:20 1021 5 10:00:25 1021 6 10:00:30 1021 7 10:00:35 1022 8 10:00:40 1022 9 10:0

首先,我是新来的,所以请通知我在提问时是否可以做得更好/与众不同

我在MySQL数据库中有一个表,如下所示:

ID  Time    Object
1   10:00:05    1021
2   10:00:10    1021
3   10:00:15    1021
4   10:00:20    1021
5   10:00:25    1021
6   10:00:30    1021
7   10:00:35    1022
8   10:00:40    1022
9   10:00:45    1022
10  10:00:50    2300
11  10:00:55    2300
12  10:01:00    2300
14  10:01:10    2300 
15  10:01:15    2401
16  10:01:20    2503
18  10:01:30    2503
我希望在视图中而不是在应用程序中执行此操作的原因是,我希望在数据进入数据库之前减少所需的步骤数量

现在,我希望在视图中实现以下格式。 从原始表中的所有记录中,我希望记录在同一行上。之后的记录并不总是有一个比第一个高1的ID,但它总是更高。第一条记录将标记为_1,之后的记录将标记为_2。我想对原始表中的所有3列执行此操作

ID_1    ID_2    Time_1  Time_2  Object_1    Object_2
1        2     10:00:05 10:00:10    1021    1021
2        3     10:00:10 10:00:15    1021    1021
3        4     10:00:15 10:00:20    1021    1021
4        5     10:00:20 10:00:25    1021    1021
5        6     10:00:25 10:00:30    1021    1021
6        7     10:00:30 10:00:35    1021    1022
7        8     10:00:35 10:00:40    1022    1022
etc...
当我开始创建视图时,我遇到了无法创建两列的问题。。我试着在网上搜索类似的问题,但找不到任何适合我的

这是迄今为止我唯一拥有的东西:

VIEW `View` AS
    SELECT 
        `Table`.`ID` AS `ID-1`,
        `Table`.`Time` AS `Time-1`,
        `Table`.`Object` AS `Object-1`

    FROM
        `Table`
    ORDER BY `Table`.`ID`  
我希望有人能帮助我/将我推向正确的方向:

致以最良好的祝愿,
L.Meijdam

看起来您正在将奇数id连接到下一个id,因此自连接可能需要mod%测试

select t.id,t1.id,t.time,t1.time,t.object,t1.object
from t
left join t t1 on t1.id = t.id + 1 and t.object = t1.object
where t.id % 2 > 0
order by t.object,t.id;

+------+------+----------+----------+--------+--------+
| id   | id   | time     | time     | object | object |
+------+------+----------+----------+--------+--------+
|    1 |    2 | 10:00:05 | 10:00:10 |   1021 |   1021 |
|    3 |    4 | 10:00:15 | 10:00:20 |   1021 |   1021 |
|    5 |    6 | 10:00:25 | 10:00:30 |   1021 |   1021 |
|    7 |    8 | 10:00:35 | 10:00:40 |   1022 |   1022 |
|    9 | NULL | 10:00:45 | NULL     |   1022 |   NULL |
|   11 |   12 | 10:00:55 | 10:01:00 |   2300 |   2300 |
|   13 |   14 | 10:01:05 | 10:01:10 |   2300 |   2300 |
|   15 | NULL | 10:01:15 | NULL     |   2401 |   NULL |
|   17 |   18 | 10:01:25 | 10:01:30 |   2503 |   2503 |
+------+------+----------+----------+--------+--------+
9 rows in set (0.00 sec)
如果您不相信id是连续的,并且您可能不应该这样做,那么如果您有mysql版本8或更高版本,如果用户行数低于8,则使用lag函数

对于行号模拟,代码如下所示

select tid,t1id,ttime,t1time,tobject,t1object
from
(
select t.id tid,t.time ttime, t.object tobject, 
        if(t.object<> @p,@rn:=1,@rn:=@rn+1) rn,
        @p:=t.object p
from t
cross join (select @rn:=0,@p:=0) r
order by object , time
) t
left join
(
select t.id t1id, t.time t1time, t.object t1object,
        if(t.object<> @p1,@rn1:=1,@rn1:=@rn1+1) rn,
        @p1:=t.object p
from t
cross join (select @rn1:=0,@p1:=0) r
order by object , time
) t1
on t1object = tobject and t1.rn = t.rn + 1
where t.rn % 2 > 0
order by tobject,tid;

更详细一点,但可能也更健壮。

您需要将表连接到自身,并为每个表指定一个单独的名称 然后从每个表中选择所需的列。 选择 t1.`ID`作为`ID-1`, t2.`ID`作为`ID-2`, . . . 从…起 `posrep`as t1加入`posrep`as t2 哪里

尝试此方法。请用表名替换测试:

            SELECT  a.id as ID_1,
                b.id as ID_2,
                a.Time as Time_1,
                b.Time as Time_2,
                a.Object as Object_1,
                b.Object as Object_2
            FROM 
            (SELECT * FROM `test`) as a,
            (SELECT * FROM `test`) as b 
            WHERE a.id+1 = b.id

使用以下sql查询创建视图,并用实际的表名替换“table_name”


从“表名称”中选择ID作为ID_1,ID+1作为ID_2

你是如何决定如何划分列的?视图在MySQL中几乎没有任何用处,所以我不知道你为什么要这样做。此外,这种事情通常最好在应用程序代码中处理,如果可以的话。请阅读并执行。特别是使用语言来表示,对于给定的值行和所需结果的列,它在输出中所属的条件。解释一下你的例子是什么。这并不明显。这不仅让我们知道你需要什么,让你的问题实际上是一个问题,而不是模糊的东西,而且让你自己能够找到这样的解决方案,总的来说&知道你在做什么。PS通过后期编辑澄清,而不是评论。我使用了它们,但只是为了开发/调试——自动解码某些复杂字段,以便更快地扫描表格内容。坦率地说,我想不出还有什么其他的方法来处理它们。这对我的示例数据集是有效的,但我发现在真实的数据集中,ID并不总是正好高出1,有时甚至超过1。我更新了我的示例数据集,以便ID的差异不总是1。您好,这将不起作用,因为后面的记录的ID并不总是比第一个记录的ID高1,但它总是更高。我不太确定,但您可以做的是在视图中检索同一个表并从中删除第一行。并从两个视图中检索ID列,使其向上移动。我尝试了此查询,但ID与我希望获得的输出不匹配。请注意,我编辑此问题是希望我的问题现在更清楚。你说得对,我不应该相信ID是连续的,因为它们不是连续的。只要删除where条件就行了!我现在唯一的问题是,在一些记录中,t1记录在所有t1列上都为Null。当tobject与t1object不同时,似乎会发生这种情况。不过,我确实需要这些记录。