2015-11-03 46 views
0

我想要一个查询,每次使用每种颜色时都会计数。如何计算MySQL中的内部连接和多个条件

tbl_places是保存来自几个枚举表的数据的主表。 tbl_places为不同建筑物中特定楼层的颜色保留相应的INT值。 `

tbl_paintcolor是一个包含2列的枚举表:值和颜色。

我不知道如何将ON子句与我要在tbl_places中计数的特定列相关联。

SELECT 
    `tbl_paintcolor`.`Color` AS Paint_Color, 
    count(`tbl_places`.`blg1floor1_color`) AS Blg1Floor1, 
    count(`tbl_places`.`blg1floor2_color`) AS Blg1Floor2, 
    count(`tbl_places`.`blg1floor3_color`) AS Blg1Floor3 
FROM `tbl_places` 
INNER JOIN `tbl_paintcolor` ON (`tbl_places`.`blg1floor1_color`=`tbl_paintcolor`.`Value` OR `tbl_places`.`blg1floor2_color`=`tbl_paintcolor`.`Value`) 
GROUP BY `tbl_paintcolor`.`Color` 

该查询结束了或多或少地计算同一列。

如何将ON子句中的条件表达式与我想在SELECT子句中计算的列相关联?

我想查询为每个特定楼层输出一列,每行记录颜色被找到的时间。此查询的输出将被结构化:

╔════════╦════════════╦════════════╦════════════╗ 
║ Color ║ Blg1Floor1 ║ Blg1Floor2 ║ Blg1Floor3 ║ etc... 
╠════════╬════════════╬════════════╬════════════╣ 
║ red ║  23  ║  23  ║  23  ║ 
║ orange ║  23  ║  23  ║  23  ║ 
║ yellow ║  23  ║  23  ║  23  ║ 
╚════════╩════════════╩════════════╩════════════╝ 

感谢您的时间,并道歉,如果这还不清楚,我是很新的SQL。

+0

您的查询不罢工我是错的。你目前的产出是多少? –

+0

它为每列输出相同的计数。我认为我的问题在OR语句中。我正在寻找一种更好的方法来将ON子句链接到我的SELECT子句 –

+0

如果您向我们展示数据和查询输出的可重复示例,可能会有所帮助。 –

回答

0

SUM()CASE WHEN将做的伎俩。

SELECT 
     `tbl_paintcolor`.`Color` AS Paint_Color, 
     SUM(CASE WHEN `tbl_places`.`blg1floor1_color` IS NOT NULL THEN 1 ELSE 0 END) AS Blg1Floor1, 
     SUM(CASE WHEN `tbl_places`.`blg1floor2_color` IS NOT NULL THEN 1 ELSE 0 END) AS Blg1Floor2, 
     SUM(CASE WHEN `tbl_places`.`blg1floor2_color` IS NOT NULL THEN 1 ELSE 0 END) AS Blg1Floor3 
    FROM `tbl_places` 
    LEFT JOIN `tbl_paintcolor` 
    ON (`tbl_places`.`blg1floor1_color`=`tbl_paintcolor`.`Value` 
           OR `tbl_places`.`blg1floor2_color`=`tbl_paintcolor`.`Value`) 
    GROUP BY `tbl_paintcolor`.`Color` 

希望这有助于

+0

谢谢@Subin!这对我有用。 –

1

我想你应该尝试用SUM更换COUNT

SELECT 
    `tbl_paintcolor`.`Color` AS Paint_Color, 
    SUM(IF(`tbl_places`.`blg1floor1_color`=`tbl_paintcolor`.`Value`, 1, 0)) AS Blg1Floor1, 
    SUM(IF(`tbl_places`.`blg1floor2_color`=`tbl_paintcolor`.`Value`, 1, 0)) AS Blg1Floor2, 
    SUM(IF(`tbl_places`.`blg1floor3_color`=`tbl_paintcolor`.`Value`, 1, 0)) AS Blg1Floor3, 
FROM `tbl_places` 
INNER JOIN `tbl_paintcolor` ON (
     `tbl_places`.`blg1floor1_color`=`tbl_paintcolor`.`Value` 
     OR `tbl_places`.`blg1floor2_color`=`tbl_paintcolor`.`Value` 
     OR `tbl_places`.`blg1floor3_color`=`tbl_paintcolor`.`Value` 
) 
GROUP BY `tbl_paintcolor`.`Color` 

或另一种方式,你可以尝试是

SELECT `tbl_paintcolor`.`Color` AS Paint_Color, 
    (SELECT COUNT(1) AS qty FROM `tbl_places` p1 WHERE p1.`blg1floor1_color`=`tbl_paintcolor`.`Value`) AS Blg1Floor1, 
    (SELECT COUNT(1) AS qty FROM `tbl_places` p2 WHERE p2.`blg1floor2_color`=`tbl_paintcolor`.`Value`) AS Blg1Floor2, 
    (SELECT COUNT(1) AS qty FROM `tbl_places` p3 WHERE p3.`blg1floor3_color`=`tbl_paintcolor`.`Value`) AS Blg1Floor3 
FROM `tbl_paintcolor` 
+0

感谢@David,您的第一个脚本对我更好,因为我有日期列,并且我可以使用where子句来聚焦查询 –