【问题标题】:How do count with inner join and multiple conditions in MySQL如何在 MySQL 中计算内部联接和多个条件
【发布时间】:2016-02-03 03:11:39
【问题描述】:

我想要一个每次使用每种颜色时都会计数的查询。

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 新手。

【问题讨论】:

  • 您的查询并没有让我觉得是错误的。你目前的输出是多少?
  • 它为每一列输出相同的计数。我认为我的问题出在 OR 语句中。我正在寻找一种将 ON 子句链接到我的 SELECT 子句的更好方法
  • 如果您向我们展示一个包含数据和查询给出的输出的可重现示例,这可能会有所帮助。

标签: mysql join conditional


【解决方案1】:

我认为您应该尝试将 COUNT 替换为 SUM

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`

【讨论】:

  • 谢谢@David,你的第一个脚本对我来说效果更好,因为我有一个日期列,我可以使用 where 子句来集中查询
【解决方案2】:

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`

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 2021-03-18
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多