查询以从与给定值相同的列中选择值,但不同的行
Posted
技术标签:
【中文标题】查询以从与给定值相同的列中选择值,但不同的行【英文标题】:Query to select values from the same column as given values, but different rows 【发布时间】:2022-01-21 15:18:22 【问题描述】:我有一张学校时间表的表格,如下所示,其中 p1..p4 是“周期” 第一行中周期 p1,p2,p3,p4 的值包含受试者 s1,s2,s3,... 在某些日子的“时间”。需要返回给定主题列表在特定日期的所有时间列表。
假设所有字段都是字符串
---------t_time--------
day p1 p2 p3 p4
0 null 4 5 6 7
1 mon s1 s2 s3 s4
2 tue s2 s3 s4 s5
3 wed s3 s4 s5 s1
4 mon s2 s4 s3 s1
例如,对于 day = ['mon','wed'] sub = ['s1','s3'],输出将是这样的:
day sub time
0 mon s1 4
1 mon s3 6
3 wed s3 4
4 wed s1 7
5 mon s1 7
到目前为止,我在 php|mysqli 中使用了一个非常低效的搜索循环,并想更改它。
我认为将第 0 行作为自己的表分开会更有意义,但显然这是我必须使用的约束
---------t_time--------
day p1 p2 p3 p4
0 mon a b c d
1 tue b e a b
2 wed p q d e
3 mon m n o p
---------p_time--------
period time
0 p1 4
1 p2 5
2 p3 6
3 p4 7
但在这种情况下,我必须以某种方式查询包含一行中特定值的列的 column_names,我无法理解。
【问题讨论】:
这里有什么问题? @Barmar 如何形成查询.. 就是这样:( 查找与日期和主题匹配的行。然后将其与返回空行的子查询连接以获取时间。 子查询会怎么走.. 我可以开个坏玩笑,这就是你在完成作业时遇到困难的原因。 【参考方案1】:将每一行与具有空行的类连接起来以获取该类的时间。您必须为每个期间列单独执行此操作,然后将它们合并在一起以获得最终结果。
SELECT t1.day, t1.p1 AS sub, t2.p1 AS time
FROM t_time AS t1
CROSS JOIN t_time AS t2
WHERE t1.day IN ('mon', 'wed') AND t1.p1 IN ('s1', 's3')
AND t2.day IS NULL
UNION
SELECT t1.day, t1.p2, t2.p2
FROM t_time AS t1
CROSS JOIN t_time AS t2
WHERE t1.day IN ('mon', 'wed') AND t1.p2 IN ('s1', 's3')
AND t2.day IS NULL
UNION
SELECT t1.day, t1.p3, t2.p3
FROM t_time AS t1
CROSS JOIN t_time AS t2
WHERE t1.day IN ('mon', 'wed') AND t1.p3 IN ('s1', 's3')
AND t2.day IS NULL
UNION
SELECT t1.day, t1.p4, t2.p4
FROM t_time AS t1
CROSS JOIN t_time AS t2
WHERE t1.day IN ('mon', 'wed') AND t1.p4 IN ('s1', 's3')
AND t2.day IS NULL
DEMO
如果数据被规范化,这会简单得多,每个时期都在一个单独的行中,并且像你提到的那样分隔表格。但是,如果您遇到这种情况,您需要为每个时间段单独查询,本质上是将列转换为行。
【讨论】:
以上是关于查询以从与给定值相同的列中选择值,但不同的行的主要内容,如果未能解决你的问题,请参考以下文章