我有一個學校時間表的表格,如下所示,其中 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,這是我無法理解的。
uj5u.com熱心網友回復:
將每一行與一個帶有空行的類連接以獲取該類的時間。您必須為每個期間列分別執行此操作,然后將它們全部結合在一起以獲得最終結果。
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
演示
如果資料經過標準化,每個時期都在單獨的行中,并且按照您的說法將表格分開,這會簡單得多。但是,如果您堅持這一點,您需要對每個時期進行單獨的查詢,基本上是將列轉換為行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386890.html
上一篇:以defi,gamefi,socialfi為基礎,決議元宇宙經濟體系的建構(上)
下一篇:如何根據條目制作列通配符?
