繁体   English   中英

如何在MySQL中使用内部联接和多个条件进行计数

[英]How do count with inner join and multiple conditions in MySQL

我想查询一次使用每种颜色的次数。

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

tbl_paintcolor是具有两列的枚举表:值和颜色。

我不知道如何将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的新手。

我认为您应该尝试将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`

使用CASE WHEN SUM()可以解决问题。

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`

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM