我尝试了以下查询并在MySQL中出错。我知道为什么它会给我一个语法错误(它与两个DISTINCT查询在同一行上运行有关),但仍然认为它可能(某种程度上)。两列card_type
和split_type
各包含五个值中的一个("攻击","基础","字符",&# 34;资产","行动")。我想要做的是创建一个查询,将记录计为+1,如果"攻击"出现在card_type
或split_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,它们是相同的。如果它们匹配,则将其计为一个。
答案 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_type
与card_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)
完全不同。
SELECT DISTINCT
与SELECT 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_type
和split_type
更多Link可以帮助您。
答案 2 :(得分:-1)
试试这个:
SELECT COUNT(DISTINCT(ufs.rarity)) AS COUNT ...
享受您的代码!