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

标签 php mysql sql

我尝试了以下查询,但 MySQL 出现错误。我有点知道为什么它会抛出语法错误(它与在同一行上运行的两个不同的查询有关),但仍然相信它是可能的(以某种方式)。 card_typesplit_type 两列各包含五个值之一(“Attack”、“Foundation”、“Character”、“Asset”、“Action”)。我想做的是创建一个查询,如果“Attack”出现在 card_typesplit_type 中,则该查询会将记录计为 +1。

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 列条件的结果总数。

示例: 如果“攻击”一词出现在 A 列或 B 列中,则计为 1。

如果A列中出现“攻击”一词,但B列包含“基础”一词,则攻击+1,基础+1。

最后,函数/SQL 将返回该单词(五个可能的单词之一)出现在这两列之间的次数。简而言之,我使用了“DISTINCT”命令(不正确的我将添加),以便返回 A 列中的所有不同值,并且 B 列中的值相同。如果它们匹配,则将其计为 1。

最佳答案

问:“如果“Attack”出现在 card_type 或 split_type 中,该查询会将记录计为 +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_type 所在的任何行。匹配card_type .

两个组合查询将用作内联 View ,外部查询将使用 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 列表中的表达式来执行条件测试,返回零或一,然后使用 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 的计数,如果我们包含 GROUP BY ufs.card_type 子句,则会返回该计数。

MySQL 还为 bool 表达式提供了一种方便的简写方式: bool 表达式的计算如果为 TRUE,则返回 1;如果为 FALSE,则返回 0;如果为 NULL,则返回 NULL。所以这个表达式:

SELECT SUM(ufs.card_type LIKE '%Attack%' OR ufs.split_type LIKE '%Attack%')
  FROM ...

与上面查询中的表达式等效,只是对 NULL 值的处理不同。

不清楚是否要检查该列是否“包含”字符串 'Attack'作为字符串的一部分,或者是整个字符串;检查该列的值是否完全等于 'Attack' ,使用相等比较而不是 LIKE

SELECT SUM(ufs.card_type = 'Attack' OR ufs.split_type = 'Attack') AS cnt
  FROM ...
<小时/>

注意

<强> DISTINCT 不是一个函数,而是一个关键字。

有效语法为 SELECT DISTINCT expr1, expr2, ... exprN FROM ...

包含 DISTINCT 无效关键字多次出现在 SELECT 关键字之后,或者位于紧随 SELECT 以外的位置。 。 ( DISTINCT 关键字也可以包含在 COUNT() 聚合函数中,例如 SELECT COUNT(DISTINCT expr) ,但这与 SELECT DISTINCT 完全不同。

括号被完全忽略。即SELECT DISTINCT(foo)SELECT DISTINCT foo 相同。包含括号是完全没有必要的,并且使它看起来像 DISTINCT 是一个函数(实际上不是。)

关于php - 如何收集两个不同查询的 COUNT(*) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24977806/

相关文章:

php 应用程序/控制台学说 :database:import returns OutOfMemoryException

php - 在选择查询中包含附加字段

java - 为什么 ResultSet 没有获取我的 ClientId 字段? MySQL、 Spring

mysql - SQL Server - 返回 null 的 SELECT 语句

javascript - 尝试在 php 服务器的本地目录中加载 js/css 时如何修复 '301 Moved Permanently'?

php - 将 SQL 表导出到 CSV,列名未出现

mysql - Oracle 和 MySql 的 DD-MON-YY 通用日期格式

mysql - 使用 sum(columnS) 选择不同的列和列

mysql - 无法连接到 XAMPP MySQL

php - SQL查询按每日销量顺序显示所有产品