2013-02-14 15 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