我尝试了以下查询,但 MySQL 出现错误。我有点知道为什么它会抛出语法错误(它与在同一行上运行的两个不同的查询有关),但仍然相信它是可能的(以某种方式)。 card_type
和 split_type
两列各包含五个值之一(“Attack”、“Foundation”、“Character”、“Asset”、“Action”)。我想做的是创建一个查询,如果“Attack”出现在 card_type
或 split_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/