在MySql中使用自联接来透视表

时间:2018-06-12 18:36:11

标签: mysql pivot-table self-join

我需要像这样转动一个表:

source /Users/mmmm/PycharmProjects/kt/venv/bin/activate
cd tests
python test1.py

到此:

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

@Rick James在早期问题how to pivot a table in mysql using model中的以下代码有效但我需要扩展它:

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

根据下面的解决方案,我尝试了这个(我现在正在添加实际的列名而不是我示例中的缩写字母):

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

我必须做错事,因为我没有得到不同的媒体ID,而且每个单元格都被填充,而其中一些应该是空的。例如,在第一行中,我每次都会重复308和310,这应该只是一个的值,在这种情况下是'B'或到期日期。如果有人能指出我在这里的逻辑中做错了什么,我会很感激。

1 个答案:

答案 0 :(得分:0)

您可以通过以下查询获得此结果:

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