mysql - 在 MySql 中使用自连接到数据透视表

标签 mysql pivot-table self-join

我需要像这样旋转表格:

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 在之前的问题 how to pivot a table in mysql using model有效,但我需要扩展它:

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

关于mysql - 在 MySql 中使用自连接到数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823695/

相关文章:

sql - 使用纯 SQL 来匹配表中的行对?

php - 选择相同列值以字符串开头的行,2 个问题

php - 通过数据库搜索不起作用

php - 我可以在 PHP 中混合使用 MySQL API 吗?

excel - 根据数据透视表中的值列(计数)计算平均值

Mysql销售表按客户分组按月列显示透视查询

sql - 在 SQL Server 中使用 'Pivot' 将行转换为列

sql-server-2008 - SQL Server 2008 使用 ISNULL 语句优化 FULL JOIN

mysql - 如何在程序中将变量设置为 `table`?

ruby-on-rails - 如何在 ActiveRecord 中建立自反自联接关系?