Mysql 创建一个视图,其中来自同一列的两条记录位于同一行上
首先,我是新来的,所以请通知我在提问时是否可以做得更好/与众不同 我在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
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不同时,似乎会发生这种情况。不过,我确实需要这些记录。