如何使用 MySQL 中的内部连接和多个条件进行计数
How do count with inner join and multiple conditions in MySQL
我想要一个在每次使用每种颜色时都进行计数的查询。
tbl_places 是主要的 table,它保存来自多个枚举 table 的数据。 tbl_places保存着不同建筑物特定楼层颜色对应的INT值。 `
tbl_paintcolor 是一个包含 2 列的枚举 table:值和颜色。
我不知道如何将 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()
和 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`
希望对您有所帮助
我认为您应该尝试将 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`
我想要一个在每次使用每种颜色时都进行计数的查询。
tbl_places 是主要的 table,它保存来自多个枚举 table 的数据。 tbl_places保存着不同建筑物特定楼层颜色对应的INT值。 `
tbl_paintcolor 是一个包含 2 列的枚举 table:值和颜色。
我不知道如何将 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()
和 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`
希望对您有所帮助
我认为您应该尝试将 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`