查询以从与给定值相同的列中选择值,但不同的行

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

如果数据被规范化,这会简单得多,每个时期都在一个单独的行中,并且像你提到的那样分隔表格。但是,如果您遇到这种情况,您需要为每个时间段单独查询,本质上是将列转换为行。

【讨论】:

以上是关于查询以从与给定值相同的列中选择值,但不同的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何查询出某一列中不同值出现的次数?

sql查询以选择两列中具有相同id但不同值的记录

如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server

SQL查询以从逗号分隔的列中检索值[重复]

比较 2 个表中的值并生成具有差异的新表

比较另一个 id 下属于不同 ids 组的行并将结果打印在单独的列中