2017-05-30 253 views
-1

我有一個像下面兩個表:性能的解決方案

表媒體:

+---------------------------------------------------------+ 
| media_id | media_name | media_category | media_status | 
+---------------------------------------------------------+ 
| 1  | item1  | 2    | true   | 
| 2  | item2  | 2    | true   | 
| 3  | item3  | 1    | false  | 
| 4  | item3  | 1    | false  | 
| 5  | item3  | 1    | true   | 
+---------------------------------------------------------+ 

表類別:

+--------------------+ 
| cat_id | cat_name | 
+--------------------+ 
| 1  | blue  | 
| 2  | red  | 
| 3  | white  | 
| 4  | green  | 
+--------------------+ 

我希望檢索所有類別的相關數量媒體的地位。

所以在我的例子,其結果必然是:

+--------------------------------------------------------------------------------+ 
| cat_id | cat_name | countMediaTotal | countMediaActive | countMediaInactive | 
+--------------------------------------------------------------------------------+ 
| 1  | blue  | 3    | 1     | 2     | 
| 2  | red  | 2    | 2     | 0     | 
| 3  | white  | 0    | 0     | 0     | 
| 4  | green  | 0    | 0     | 0     | 
+--------------------------------------------------------------------------------+ 

我實際的SQL請求:

SELECT *, 
(SELECT COUNT(*) FROM media AS MED WHERE CAT.cat_id = MED.media_category) AS countMediaTotal, 
(SELECT COUNT(*) FROM media AS MED WHERE CAT.cat_id = MED.media_category AND media_status = 'true') AS countMediaActive, 
(SELECT COUNT(*) FROM media AS MED WHERE CAT.cat_id = MED.media_category AND media_status = 'false') AS countMediaInactive 
FROM `category` AS CAT 

有3個類似的子查詢。

有沒有更強大的解決方案來實現這一目標還是最好的?

+0

什麼是 「最好的」 是什麼意思? (修辭)你對某些查詢表達式有一些天真含糊的概念,這些查詢表達式被日常用語合理地模糊地描述。技術含義涉及在給定背景下的工程權衡。請閱讀「程序優化」和「查詢優化」。你可以從標籤信息開始。 – philipxy

+0

是的,你是對的。我以爲只有演出 – mytom

+0

不幸的是,我所有的評論都適用於其他更具體的單詞,比如「表演」(無論你是什麼意思 - 你表達的是什麼?)或「速度」。任何合理的技術含義都涉及很多因素。 – philipxy

回答

0

我會做這樣的事情...

SELECT c.* 
    , COALESCE(m.media_status,0) media_status 
    , COUNT(0) total 
    FROM category c 
    LEFT 
    JOIN media m 
    ON c.cat_id = m.media_category 
GROUP 
    BY c.cat_id 
    , m.media_status; 

...和處理在應用程序代碼的任何剩餘的顯示問題。

1

你可以這樣說:

SELECT c.cat_id, c.cat_name, 
COUNT(*) AS countMediaTotal, 
SUM(IF(m.media_status = 'true', 1, 0)) AS countMediaActive, 
SUM(IF(m.media_status = 'false', 1, 0)) AS countMediaInactive 
FROM `category` AS c 
LEFT JOIN media m ON m.media_category = c.cat_id 
GROUP BY c.cat_id, c.cat_name 
+0

是的,但它比我的主張更快嗎? – mytom

+0

最有可能。您的子查詢會爲您的分類表中的每一行執行。您還可以執行'EXPLAIN '來查看是否以及如何使用索引。最後,你所要做的就是測量;-) – fancyPants