我有一个非常简单的表,如下所示:
id | custom_id | answer
----------------------------------
1 | 123 | Answer 1
__________________________________
2 | 123 | Answer 2
__________________________________
3 | 422 | Answer 3
__________________________________
4 | 345 | Answer 2
__________________________________
5 | 992 | Answer 1
__________________________________
6 | 452 | No answer
__________________________________
我想做的是计算Answer 1
,Answer 2
等的数量。因此,对于上述数据,我希望得到:
2 * Answer 1
2 * Answer 2
1 * Answer 3
请注意,任何No answer
都应该丢弃。
但是,除了上述内容之外,我只想考虑每个custom_id
的一个答案,这应该是他们的第一个答案。所以说真的,我期望获得上述数据的输出应该是:
2 * Answer 1
1 * Answer 2
1 * Answer 3
这是因为我们只为custom_id = 123
取第一个答案。
到目前为止,我已经进行了以下查询:
select
answer,
count(*) as totalCount
from
" . DB_TABLE . "
where
answer <> 'No answer'
group by
custom_id
但是,这似乎返回了总数(如我首先解释的那样),没有考虑到每个custom_id
中应该只有一个。我以为该小组可以解决这个问题,但事实并非如此。
我如何获得想要的结果?
谢谢
答案 0 :(得分:3)
一种方法是,首先使用每个IDs
的第一个答案的custom_id
创建派生表,并过滤值No answer
的表(因为您想忽略它们) ),就像这样:
SELECT
custom_id,
MIN(id) AS firstAnswerID
FROM
<table_name>
WHERE
answer <> "No Answer"
GROUP BY
custom_id
然后,我们可以在ID
列上将原始表与上一个表连接起来(对于那些不是第一个答案或没有No answer
值的表,它就像一个过滤器), GROUP BY
answer
列中,计算每个数字。总之,这将满足您的要求:
SELECT
t1.answer,
COUNT(*) AS NumTimes
FROM
<table_name> AS t1
INNER JOIN
( SELECT
custom_id,
MIN(id) AS firstAnswerID
FROM
<table_name>
WHERE
answer <> "No Answer"
GROUP BY
custom_id ) AS t2 ON t2.firstAnswerID = t1.id
GROUP BY
t1.answer
ORDER BY
NumTimes DESC
您可以在这里玩这个游戏:DB Fiddle
答案 1 :(得分:0)
尝试使用此功能:
select answer, count(answer) as totalCount from " . DB_TABLE .
" where answer <> 'No answer' group by answer
您应该为每个答案组而不是整个表格计算行数。