Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数多列_Mysql_Sql - Fatal编程技术网

Mysql 数多列

Mysql 数多列,mysql,sql,Mysql,Sql,我有这张桌子: Teams: ID | Size1 | Size2 | Size3 | Size4 | ... (other columns).. ---------------------------------------- 1 | L | XL | L | M | ... ---------------------------------------- 2 | S | L | S | XXL | ... ------------

我有这张桌子:

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个L,第二列有2个,第三列有151个,第四列有3个,我预计结果是308个,假设每行只能有一个“L”:

或规范化解决方案,该解决方案支持每行多个'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'
您的WHERE条件将非常大,但您可以使用以下方法:

选择countSize1+countsize2作为总计,其中size1='L'或size2='L'

此解决方案将根据单个列的比较来计算所有列和总计。

您可以使用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;
或者,您可以使用IF代替CASE:

这其实是一样的

编辑

根据Andromar的评论,还有更简单的解决方案:

SELECT 
  sum(Size1 = 'L') +
  sum(Size2 = 'L') +
  sum(Size3 = 'L') +
  sum(Size4 = 'L')
FROM Teams;
这是正确的,因为在MySQL中true等于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

从Size1='L'所在的团队中选择SELECT COUNT*,从Size2='L'所在的团队中选择COUNT*,从Size3='L'所在的团队中选择COUNT*,从Size4='L'所在的团队中选择COUNT*;考虑将大小字段归一化到自己的表中,然后只需对其进行单计数,如果另一个大小,则不必更改表。否则,Alexander的答案是正确的。@Buksy现在你需要检查所有关于性能的查询,并给出最终答案。顺便说一句,如果这张表显示了每种尺寸的衣服的可用性,那么这种结构不是最好的。你能像这样在列中做值吗?这对我来说是个新闻me@Askanison4:b,c,d中的a只是a=b或a=c或a=d@dragoste:正确。我认为同一个产品有两种称为L的尺寸是没有意义的,示例数据也同意这一点。@Andomar我们不是来决定在作者的任务中什么是有意义的。在提供的示例数据的第一行中有两个L。第一个查询对我来说不起作用,请从表中选择count*,其中size1、size2、size3、size4中的“L”返回152,而第一列中有152个L,第二列中有2个,第三列中有151个,第四列中有3个。因为在MySQL中,true为1,较短的版本为sumsize='L'。例如。括号中有拼写错误 在第二个查询中,我无法编辑它:即使只有一行,也应该计算两次行数L@Andomar是的,这是他的预期结果。
SELECT 
  sum(Size1 = 'L') +
  sum(Size2 = 'L') +
  sum(Size3 = 'L') +
  sum(Size4 = 'L')
FROM Teams;
   SELECT sum(
      (Size1 = 'L') + 
      (Size2 = 'L') +
      (Size3 = 'L') +
      (Size4 = 'L') )
    FROM Teams;
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