【问题标题】:Query database to obtain first unique value查询数据库获取第一个唯一值
【发布时间】:2018-12-06 22:02:03
【问题描述】:

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

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 应该只有一个。我以为 group by 会解决这个问题,但似乎不是这样。

我怎样才能达到我所追求的结果?

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    一种方法,首先是为每个custom_id 创建一个带有IDs 的第一个答案的派生表,并过滤那些具有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

    【讨论】:

      【解决方案2】:

      尝试使用这个:

      select answer, count(answer) as totalCount from " . DB_TABLE .
      " where answer <> 'No answer' group by answer
      

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

      【讨论】:

      • 我刚刚尝试过,但它仍然返回 custom_id 的重复项
      • count(*)count(answer) 之间的唯一区别是如果有空答案,那么count(answer) 将不计算在内。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 2022-08-06
      • 2015-12-06
      相关资源
      最近更新 更多