2013-02-14 47 views
-1

我已经在MySQL表下表中多个表与其他映射条目列数SQL查询用于获取

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 |..... 

和聪明一样为所有我adtype,详情要data..can请人指导我该...

THS是什么,我都试过...

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 
+0

这些表格是如何相互关联的? – 2013-02-14 05:20:51

+0

这不是提问的方式。你知道关于sql连接吗?你的背景是什么?你有什么尝试? – jurgenreza 2013-02-14 05:35:45

+0

请参阅我的问题...用我的旧查询..这不会给我正确的结果 – 2013-02-14 05:38:05

回答

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多个值,你不;吨希望它指定一个接一个。您可以创建*动态SQL8为,

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; 
+0

可以请你看我的查询,因为我已经回答...如果它更好或nt? – 2013-02-14 05:41:57

+0

它没有问题,但它是静态的。如果您在'medianame'表上有多个值,它将不会很灵活。 – 2013-02-14 05:53:12

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 

那么你需要透视这个查询的结果。 Pivoting是数据库特定的语法,我不熟悉如何在mysql中执行它(并且我总是需要在SQL Server中查找它!),但是如果您搜索它,我相信您会找到它。

+0

thanx螨...但我想要横向数averageame ...因为我在我的问题在最后一张表shine ..请看我的答案太..我已经解决了这个..佩雷斯检查它..如果米错了,然后pelase纠正我 – 2013-02-14 05:31:47

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 

这是我得到有效解决我的problem..if任何一个发现是错误的,那么请纠正我的方式。 。谢谢你

+0

您已经可以省略关键字'DISTINCT',因为您已经通过'at.adtype'将其分组。 – 2013-02-14 05:41:05

+0

ok.t​​hanx ..其他明智的可以吗? – 2013-02-14 05:43:15

+0

是的,它是多余的。 – 2013-02-14 05:43:57