我有这张桌子:
Teams:
ID | Size1 | Size2 | Size3 | Size4 | ... (other columns)..
----------------------------------------
1 | L | XL | L | M | ...
----------------------------------------
2 | S | L | S | XXL | ...
----------------------------------------
3 | M | XXL | L | M | ...
----------------------------------------
4 | L | XL | XS | XXL | ...
计算表中所有 L 的最有效(也是最简单)的MySQL查询是什么?
我希望结果中只有一个字段,即所有列中所有 L 的计数。
编辑: 只是为了澄清一点,在我的表中,第一列有152个Ls,第二列有2个,第三个有151个,第四个有3个,我期待308个结果
答案 0 :(得分:4)
您可以使用SUM
和CASE
来执行此操作:
SELECT
sum(case when Size1 = 'L' then 1 else 0 end) +
sum(case when Size2 = 'L' then 1 else 0 end) +
sum(case when Size3 = 'L' then 1 else 0 end) +
sum(case when Size4 = 'L' then 1 else 0 end)
FROM Teams;
替代CASE
,您可以使用IF
:
SELECT
sum(IF(Size1 = 'L',1, 0)) +
sum(IF(Size2 = 'L',1, 0)) +
sum(IF(Size3 = 'L',1, 0)) +
sum(IF(Size4 = 'L',1, 0))
FROM Teams;
这实际上是一样的。
修改强>
根据Andomar的评论,甚至还有更简单的解决方案:
SELECT
sum(Size1 = 'L') +
sum(Size2 = 'L') +
sum(Size3 = 'L') +
sum(Size4 = 'L')
FROM Teams;
这是正确的,因为true
在MySQL中等于1
。我刚刚验证了这个。 ; - )
第二次修改
简化此操作的下一步 - 仅使用一个SUM
:
SELECT sum(
(Size1 = 'L') +
(Size2 = 'L') +
(Size3 = 'L') +
(Size4 = 'L') )
FROM Teams;
答案 1 :(得分:1)
假设每行只能有一个'L'
:
select count(*)
from YourTable
where 'L' in (Size1, Size2, ..., SizeN)
或规范化解决方案,每行支持多个'L'
:
select count(*)
from (
select size1 as size
from YourTable
union all
select size2
from YourTable
union all
select size3
from YourTable
union all
...
)
where size = 'L'
答案 2 :(得分:1)
请尝试以下查询:
SELECT sum(
IF(Size1='L', 1, 0) +
IF(Size2='L', 1, 0) +
IF(Size3='L', 1, 0) +
IF(Size4='L', 1, 0)
) as total FROM Teams
答案 3 :(得分:0)
你的WHERE
条件会非常大,但你可以使用它:
SELECT count(Size1) + count(size2) AS total WHERE size1 = 'L' OR size2 = 'L'
此解决方案将根据各列比较计算所有列和总数。