[英]using self-join to pivot table in MySql
我需要像這樣旋轉一個表:
mediaID q_short_name start_time stop_time audio
ee A 208 210 j.mp3
ee B 308 310 j.mp3
ff A 124 127 k.mp3
ff B 166 169 k.mp3
gg C 582 584 p.mp3
gg B 489 492 p.mp3
hh D 222 225 q.mp3
hh C 121 124 q.mp3
對此:
mediaID Astart Astop Bstart Bstop Cstart Cstop Dstart Dstop audio
ee 208 210 308 310 k.mp3
ff 124 127 166 169 j.mp3
gg 489 492 582 584 p.mp3
hh 121 124 222 225 q.mp3
以下來自@Rick James的以下代碼在一個較早的問題中, 如何使用模型在mysql中透視表有效,但我需要對其進行擴展:
SELECT c.mediaID,
c.start_time AS CVVstart,
c.end_time AS CVVstop,
e.start_time AS ExpStart,
e.stop_time AS ExpStop,
c.audio_file
FROM my_test AS c
JOIN my_test AS e USING(mediaID)
WHERE c.q_short_name = 'A'
AND e.q_short_name = 'B';
根據下面的解決方案,我嘗試了這一點(我現在在示例中添加實際的列名,而不是縮寫字母):
SELECT DISTINCT
O.mediaID,
O.start_time AS CVVStart,
O.stop_time AS CVVStop,
O.start_time AS ExpStart,
O.stop_time AS ExpStop,
O.start_time AS CredCardCVVStart,
O.stop_time AS CredCardCVVStop,
O.start_time AS CredCardNumStart,
O.stop_time AS CredCArdNumStop, O.audio_link FROM my_test
AS O
LEFT JOIN my_test AS CVVStart
ON CVVStart.mediaID = O.mediaID
AND CVVStart.q_short_name = 'CVV Number - Start and Stop Time'
LEFT JOIN my_test AS CVVStop
ON CVVStop.mediaID = O.mediaID
AND CVVStart.q_short_name = 'CVV Number - Start and Stop Time'
LEFT JOIN my_test AS ExpStart
ON ExpStart.mediaID = O.mediaID
AND ExpStart.q_short_name = 'Expiration Date - Start and Stop Time'
LEFT JOIN my_test AS ExpStop
ON ExpStop.mediaID = O.mediaID
AND ExpStop.q_short_name = 'Expiration Date - Start and Stop Time'
LEFT JOIN my_test AS CredCardCVVStart
ON CredCardCVVStart.mediaID = O.mediaID
AND CredCardCVVStart.q_short_name = 'Credit Card CVV - Start and Stop
Time'
LEFT JOIN my_test AS CredCardCVVStop
ON CredCardCVVStop.mediaID = O.mediaID
AND CredCardCVVStop.q_short_name = 'Credit Card CVV - Start and Stop
Time'
LEFT JOIN my_test AS CredCardNumStart
ON CredCardNumStart.mediaID = O.mediaID
AND CredCardNumStart.q_short_name = 'Credit Card Number - Start and Stop
Time';
我一定在做錯事,因為我沒有得到不同的媒體ID,而且每個單元格都已填充,而其中某些單元應該為空。 例如,在第一行中,我分別重復308和310,這應該只是其中一個的值,在這種情況下為“ B”或“到期日期”。 如果有人能指出我在這里的邏輯中做錯了什么,我將不勝感激。
您可以通過以下查詢獲得此結果:
SELECT
O.mediaID,
-- start and stop for needed short_name here
O.audio
FROM (
SELECT DISTINCT mediaID, audio FROM my_test
) AS O
LEFT JOIN my_test AS A
ON A.mediaID = O.mediaID
AND A.q_short_name = 'A'
LEFT JOIN my_test AS B
ON B.mediaID = O.mediaID
AND B.q_short_name = 'B'
LEFT JOIN my_test AS C
ON C.mediaID = O.mediaID
AND C.q_short_name = 'C'
在這里,我們獲得了不同的媒體ID,然后為任何q_short_name
加入該表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.