【问题标题】:MariaDB Select count of values by keysMariaDB 按键选择值的计数
【发布时间】:2021-07-06 17:48:00
【问题描述】:

我有这张表,我想通过 2 个键获取常用值的计数... 例如,如果我输入键 1981 和 1975,我得到的计数是 3(它们都有 2255、2228、2232)等等。我只知道如何用 PHP 解决它,但它比用 SQL 慢得多。谢谢

全表转储(mysql 命令):DUMP

PHP-ish 解决方案将是(从头开始,没有优化): (对于伪代码式的文本,我们深表歉意)

$1 = Select * From tbl Where Key = key1;
$2 = Select * From tbl Where Key = key2;

$counter = 0;
foreach($1 as $item)
{
    foreach($2 as $item2)
    {
        if($item->value == $item2->value)
        {
            $counter++;
        }
    }
}

return $counter;

【问题讨论】:

标签: mysql sql mariadb


【解决方案1】:

您需要 2 个级别的聚合。

首先,使用这个查询:

SELECT value
FROM stats
WHERE `key` IN (1981, 1975)
GROUP BY value
HAVING COUNT(*) = 2 // the number of values that you search for

你得到满足keys都属于它们的条件的values,然后将其用作子查询来计算values:

SELECT COUNT(*) counter
FROM (
  SELECT value
  FROM stats
  WHERE `key` IN (1981, 1975)
  GROUP BY value
  HAVING COUNT(*) = 2
) t 

请参阅demo

【讨论】:

  • 哦...有计数...这是我找不到的缺失链接。工作解决方案,非常感谢
【解决方案2】:

你可以试试:

CREATE TABLE `keyvalue` (
  `v` int DEFAULT NULL,
  `k` int DEFAULT NULL
);

insert into keyvalue values 
   (1,1982),(2,1982),(3,1982),
   (1,1975),(2,1975),(3,1975),(4,1975),
   (3,1983);

select k1, k2
from (
   select 
      k1.k as k1,
      k1.v as v1, 
      k2.k as k2, 
      k2.v as v2, 
      row_number() over(partition by k1.k,k2.k) as R 
   from keyvalue k1 
   inner join keyvalue k2 on k1.k!=k2.k and k1.v=k2.v 
   ) x
where k2>k1
group by k1,k2
having max(R)=3
;

DBFIDDLE

【讨论】:

  • 这并没有解决问题,我需要从您的 SQL 中提供 SQL 2 输入(k 列),例如 1 和 3,并且输出应该是常见值的 COUNT(v 列)-> in这种情况下输出应该是 2。如果我取 k1 = 2 和 k2 = 4 输出应该是 1(键 2 和 4 只有 1975 年才有共同值)。希望这个解释足够好。
  • 好的,我一定错过了您问题中的“预期输出”(他们在minimal reproducible example 中谈论这个)
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多