查询数据库以获得第一个唯一值

时间:2018-12-06 22:02:04

标签: mysql

我有一个非常简单的表,如下所示:

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 1Answer 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中应该只有一个。我以为该小组可以解决这个问题,但事实并非如此。

我如何获得想要的结果?

谢谢

2 个答案:

答案 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

您应该为每个答案组而不是整个表格计算行数。

相关问题