2017-05-30 145 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