【问题标题】:Query that only selects unique data只选择唯一数据的查询
【发布时间】:2021-09-25 03:01:26
【问题描述】:

我无法发出仅计算唯一记录的请求。
有一个表:bbs,列:

to_id - 发给谁
from_id - 发给谁

SELECT COUNT(*) AS `count` FROM `bbs` WHERE `to_id`=? OR `from_id`=?

例如,您需要以下数据:

from_id  to_id
1          2
2          1
1          3
1          4
1          2

也就是说,例如,我们是1
而且它不应该像它目前认为的那样计算5,而是3
您需要选择 2 列,只有唯一的列。
如何做到这一点?

【问题讨论】:

  • 不清楚您要完成什么。您想要计数具有不同from_id、不同to_idfrom_idto_id 的不同组合的记录吗?您的样本如何表明唯一计数仅为 1?
  • @kmoser,嗯,就是记录应该是一个,但是同一个ID可以在不同的列,这个也是需要考虑的。
  • 也就是说,例如,我们是 1。 -- 为什么这在问题中很重要?我认为您需要用清晰的逻辑术语重申您的问题。没有清晰的逻辑,很难翻译成 SQL。
  • 这组中的所有 4 对都是不同的。你是如何决定 1 是预期的答案?即使我们交换对使得我们有 (least(x, y), best(x, y)),答案仍然是 3 或 2,这取决于您是想忽略 (1, 2) 对还是只是将它们视为单个计数,然后是 (1, 3) 和 (1, 4)。
  • ?s 在您的 SQL 中是什么意思?这是一个准备好的声明吗,我们只回答一对(?, ?) 的问题?如果是这样,请提供参数值示例和相应的预期结果,并说明您用于确定该结果的逻辑。

标签: php mysql sql


【解决方案1】:

我猜你的意思类似于以下内容。

select count(distinct(FROM_ID + TO_ID)) as "COUNT"
  from BBS
 where FROM_ID = 1
    or TO_ID = 1

使用您问题中的示例数据,该查询将返回 3。
参考this db<>fiddle

我还猜测您问题中 [SQL] 查询中的问号是特定 ID 的占位符,您在问题中使用了示例值 1(一)。因此,上面的 [SQL] 查询中的 where 子句。

【讨论】:

    【解决方案2】:

    类似这样的:

    SELECT COUNT(*)
      FROM (SELECT DISTINCT LEAST(from_id, to_id), GREATEST(from_id, to_id) FROM bbs) AS xx
    ;
    

    【讨论】:

      【解决方案3】:

      我建议对COUNT(DISTINCT) 使用条件逻辑:

      SELECT COUNT(DISTINCT CASE WHEN to_id = ? THEN from_id ELSE to_id END) AS `count`
      FROM bbs
      WHERE ? IN (to_id, from_id);
      

      这里的逻辑很清楚。 id 上没有奇怪的算术运算——这也适用于字符串 id。它也不需要子查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多