используя самосоединение к сводной таблице в MySql - PullRequest
0 голосов
/ 12 июня 2018

Мне нужно повернуть таблицу следующим образом:

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'; 

Я, должно быть, что-то делаю не так, потому что я не получаю разные медиа-идентификаторы, а также заполнена каждая ячейка, в то время как некоторые из них должны быть пустыми.Например, в первом ряду я получаю 308 и 310 повторений для каждого, которые должны быть только значениями для одного, в данном случае «B» или «Дата истечения».Если бы кто-нибудь мог указать мне на то, что я делаю неправильно в логике, я был бы признателен.

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете получить этот результат с помощью следующего запроса:

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'

Здесь мы получаем различные идентификаторы мультимедиа и затем присоединяемся к этой таблице для любого q_short_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...