-1

mysqlテーブルに次のテーブルがあります

a_ad_display

╔═══════╦══════════╗
║ ADVID ║ ADTYPEID ║
╠═══════╬══════════╣
║     1 ║        1 ║
║     2 ║        1 ║
║     3 ║        4 ║
║     3 ║        3 ║
║     2 ║        2 ║
║     1 ║        4 ║
║     1 ║        3 ║
║     4 ║        1 ║
║     4 ║        1 ║
╚═══════╩══════════╝

a_mediatype

╔═════════╦═══════════╗
║ MEDIAID ║ MEDIANAME ║
╠═════════╬═══════════╣
║       1 ║ Animation ║
║       2 ║ video     ║
║       3 ║ Image     ║
╚═════════╩═══════════╝

a_ad_type

╔══════════╦════════╗
║ ADTYPEID ║ ADTYPE ║
╠══════════╬════════╣
║        1 ║ e Ad   ║
║        2 ║ b Ad   ║
║        3 ║ c Ad   ║
║        4 ║ d Ad   ║
╚══════════╩════════╝

a_advertise

╔═══════╦═════════╗
║ ADVID ║ MEDIAID ║
╠═══════╬═════════╣
║     1 ║       1 ║
║     2 ║       1 ║
║     3 ║       2 ║
║     4 ║       3 ║
╚═══════╩═════════╝

今私がフェッチしたいのは次のとおりです...

adType  | Image | video  | Animation
eAd     |    0  |    2   |    2 ...
b Ad    |...
c Ad    |...
d Ad    |.....

そして、すべてのアドタイプについて賢明なように、私はデータが欲しいです..誰かがこれについて私を案内してくれますか...

これは私が試したものです...

SELECT Distinct
at.adtype,
COUNT(IF(am.medianame = 'Animation',1,0)) AS Animation,
COUNT(IF(am.medianame = 'Video',1,0)) AS Video,
COUNT(IF(am.medianame = 'Image',1,0)) AS Image
FROM a_ad_type as at
LEFT JOIN a_ad_display as ad ON at.adtypeId = ad.adtypeId
LEFT JOIN a_advertise as adv ON adv.advertiseId = ad.advId
LEFT JOIN a_mediatype as am ON am.mediaId = adv.mediaTypeId
GROUP BY at.adtype
4

3 に答える 3

3
SELECT  a.adtype,
        SUM(CASE WHEN d.medianame = 'Image' THEN  1 ELSE 0 END) `Image`,
        SUM(CASE WHEN d.medianame = 'video' THEN  1 ELSE 0 END) `video`,
        SUM(CASE WHEN d.medianame = 'Animation' THEN  1 ELSE 0 END) `Animation`
FROM    a_ad_type a
        LEFT JOIN a_ad_display b
            ON a.adtypeId = b.adtypeId
        LEFT JOIN  a_advertise c
            ON b.advId = c.advId
        LEFT JOIN a_mediatype d
            ON c.mediaId = d.mediaId
GROUP   BY a.adtype

更新1

の値が複数ありmedianame、1つずつ指定したくない場合。そのために*DynamicSQL8を作成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN d.medianame = ''',
      medianame,
      ''' then 1 ELSE 0 end) AS `',medianame,'`'
    )
  ) INTO @sql
FROM a_mediatype;

SET @sql = CONCAT('SELECT   a.adtype, ', @sql, ' 
                  FROM  a_ad_type a
                          LEFT JOIN a_ad_display b
                              ON a.adtypeId = b.adtypeId
                          LEFT JOIN  a_advertise c
                              ON b.advId = c.advId
                          LEFT JOIN a_mediatype d
                              ON c.mediaId = d.mediaId
                  GROUP   BY a.adtype');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-02-14T05:32:34.827 に答える
2
 SELECT Distinct
at.adtype,

COUNT(CASE am.mediaId WHEN 1 THEN at.adtypeId END) As Animation,
COUNT(CASE am.mediaId WHEN 2 THEN at.adtypeId END) As Video,
COUNT(CASE am.mediaId WHEN 3 THEN at.adtypeId END) As Image
FROM a_ad_type as at
LEFT JOIN a_ad_display as ad ON at.adtypeId = ad.adtypeId
LEFT JOIN a_advertise as adv ON adv.advertiseId = ad.advId
LEFT JOIN a_mediatype as am ON am.mediaId = adv.mediaTypeId
GROUP BY at.adtype

これは私が私の問題を解決した方法です..誰かがそれを間違っていると思ったら、私を訂正してください..ありがとう

于 2013-02-14T05:33:18.520 に答える
1

次のような一般的な列を使用してテーブルを結合する必要があります

SELECT ad.adtype
      ,am.medianame
FROM   a_ad_type ad
       INNER JOIN
       a_ad_display add ON ad.adTypeId=add.adTypeId
       INNER JOIN
       a_advertise a ON add.advId=a.advId
       INNER JOIN
       a_mediatype am ON am.mediaId=a.mediaId

次に、このクエリの結果をピボットする必要があります。ピボットはデータベース固有の構文であり、mysqlでそれを行う方法に慣れていません(そして、常にSQL Serverで検索する必要があります!)が、それを検索すると、きっと見つかるはずです。

于 2013-02-14T04:52:50.647 に答える