如何收集两个不同查询的COUNT(*)?

时间:2014-07-27 04:03:57

标签: php mysql sql

我尝试了以下查询并在MySQL中出错。我知道为什么它会给我一个语法错误(它与两个DISTINCT查询在同一行上运行有关),但仍然认为它可能(某种程度上)。两列card_typesplit_type各包含五个值中的一个("攻击","基础","字符",&# 34;资产","行动")。我想要做的是创建一个查询,将记录计为+1,如果"攻击"出现在card_typesplit_type中。

SELECT DISTINCT(ufs.card_type), DISTINCT(ufs.split_type), COUNT(*) AS COUNT
    FROM jg1_products p 
    LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id 
    LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id 
    LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id
WHERE type_handler LIKE "%product_cards%"
    AND ptc.categories_id = 89
GROUP BY ufs.card_type

我想在解释中我应该更清楚一点:

我希望SQL查询返回符合A列或B列条件的结果总数。

实施例: 如果单词" Attack"出现在A列或B列中,将其计为一个。

如果单词" Attack"列A中出现,但B栏中包含单词" Foundation",这将是+1攻击和+1基金会。

最后,函数/ SQL将返回该两个列之间出现的字(五种可能中的任何一种)的次数。所以简而言之,我使用了" DISTINCT"命令(不正确的我将添加),以便返回A列中的所有不同值,对于B,它们是相同的。如果它们匹配,则将其计为一个。

3 个答案:

答案 0 :(得分:2)

问:“如果在card_type或split_type中出现”Attack“,则会将记录计为+1的查询。”

答:目前尚不清楚要返回的结果集。

修改

根据你的评论/澄清,如果我正确理解这一点,如果SELECT返回的行类似于这个例子:

card_type  split_type
---------  -----------
Attack     Attack
Attack     Foundation
Attack     Crescendo
Foundation Foundation

你想要一个像这样的结果集:

Attack     3
Foundation 2
Crescendo  1 

您希望3为“攻击”返回,因为三行在'Attack'card_type中的值为split_type。也就是说,想要返回值4,即值出现的次数。

要使用COUNT聚合获得该结果,我会将其作为两个单独的查询运行,并使用UNION ALL集合运算符合并两个查询的结果。第一个查询仅按card_type计算,第二个查询将按split_type计算。 “技巧”将是第二个查询排除 split_typecard_type匹配的任何行。

两个组合查询将用作内联视图,外部查询将使用SUM()聚合函数组合单独的计数。

我会使用如下形式进行查询:

SELECT c.type
     , SUM(c.cnt) AS cnt
  FROM ( SELECT ufs.card_type AS `type`
              , COUNT(1) AS cnt 
           FROM ...

          GROUP BY ufs.card_type

          UNION ALL

         SELECT ufs.split_type AS `type`
              , COUNT(1) AS cnt
           FROM ...

            AND NOT (ufs.split_type <=> ufs.card_type)
          GROUP BY ufs.split_type    
       ) c
 GROUP BY c.type

您将两次插入原始查询的行来源,替换上面查询中的...


上一个回答:

假设您有一个返回要检查的行的SELECT,一个“技巧”是使用SELECT列表中的表达式来执行条件测试,并返回0或1,然后使用{{1聚合返回符合规范的记录的“计数”..

SUM()

此查询返回单行,与返回多行的原始查询不同。 (同样,不清楚你想要返回什么结果集;如果你真的想要为每个不同的SELECT SUM(IF(ufs.card_type LIKE '%Attack%' OR ufs.split_type LIKE '%Attack%',1,0)) AS cnt FROM jg1_products p LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id WHERE type_handler LIKE "%product_cards%" AND ptc.categories_id = 89 返回一个计数,如果我们包含一个card_type子句,它将被返回。

MySQL还为布尔表达式提供了方便的简写:如果为TRUE,则布尔表达式的求值返回1,如果为FALSE则返回0,如果为NULL则返回NULL。所以这个表达式:

GROUP BY ufs.card_type

等同于上面查询中的表达式,但处理NULL值除外。

目前尚不清楚是否要检查列“包含”字符串SELECT SUM(ufs.card_type LIKE '%Attack%' OR ufs.split_type LIKE '%Attack%') FROM ... 是否为字符串的一部分,还是整个字符串;要检查列的值是否完全等于'Attack',请使用等式比较而不是'Attack'

LIKE

注意

SELECT SUM(ufs.card_type = 'Attack' OR ufs.split_type = 'Attack') AS cnt FROM ... 不是函数,而是关键字。

有效语法为 DISTINCT

在SELECT关键字之后多次包含SELECT DISTINCT expr1, expr2, ... exprN FROM ...关键字,或者紧跟在DISTINCT之后的位置,无效。 (SELECT关键字也可以包含在DISTINCT聚合函数中,例如COUNT(),但这与SELECT COUNT(DISTINCT expr)完全不同。

p p完全被忽略了。也就是说,SELECT DISTINCTSELECT DISTINCT(foo)相同。包括parens是完全没必要的,并使它看起来像DISTINCT是一个函数(它不是。)

答案 1 :(得分:1)

您可以尝试以下查询

SELECT DISTINCT ufs.card_type, ufs.split_type, COUNT(*) AS COUNT
    FROM jg1_products p 
    LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id 
    LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id 
    LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id
WHERE type_handler LIKE "%product_cards%"
    AND ptc.categories_id = 89
GROUP BY ufs.card_type

此处查询将从card_typesplit_type

中选择唯一记录

更多Link可以帮助您。

答案 2 :(得分:-1)

试试这个:

SELECT COUNT(DISTINCT(ufs.rarity)) AS COUNT ...

享受您的代码!