mysql计数行中非唯一数据的组合

时间:2014-01-13 06:15:19

标签: mysql sql select group-by having

我有像

这样的表格
+---+----+
|TID|DATA|
+---+----+
|1  |C   |
+---+----+
|1  |F   |
+---+----+
|1  |D   |
+---+----+
|1  |E   |
+---+----+
|2  |X   |
+---+----+
|2  |C   |
+---+----+
|2  |B   |
+---+----+
|2  |F   |
+---+----+
|3  |C   |
+---+----+

我想根据数据C和F组的组合来计算频率

因此数据CF的计数结果将类似于= 2.(显示在tid 1和2上)

这是我的查询

select count(data) from tabel where data like '%C%' and '%F%' group by tid

它没有返回所需的结果

是否可以在mysql中查询结果?或者我需要先在程序中操作它? (我正在使用vb net)

'更新要求

我想动态创建组合。有可能这样做吗?我想使用while来遍历if statement。但它没有返回任何结果并给我一个错误

这是我的代码。这仍然是错误,我认为原因是因为我无法在ALIAS COLUMN上使用IF CONDITIONAL

select count(*) from (
select kode_faktur,


if `DATA` like '%F%' and '%B%' then 1
else 0
end if

AS freq

FROM `table`
GROUP BY tid
HAVING freq = 2
) t

这就是我想做的事情,迭代IF CONDITIONALWHILE

select count(*) from (
select kode_faktur,

while i<x
if `DATA` like '%i%' then 1
else 0
end if

AS freq

FROM `table`
GROUP BY tid
HAVING freq = x
) t

这是来自@Aziz Shaikh的原始代码,这段代码有效

SELECT COUNT(*) FROM (
SELECT tid,
SUM(CASE 
   WHEN `data` LIKE '%C%' THEN 1 
   WHEN `data` LIKE '%F%' THEN 1 
   ELSE 0 
   END
) AS freq
FROM `table`
GROUP BY tid
HAVING freq = 2
) t
个人认为这在mysql中很复杂。我选择这样做是为了节省我的时间,而不是在程序中做一些代码。原因是因为我的程序已经使用了太多连接并且还处理了大数据。所以我认为mysql可以替代我的要求

3 个答案:

答案 0 :(得分:1)

您应该使用OR代替AND

select count(data) from tabel where data like '%C%' OR '%F%' group by tid

答案 1 :(得分:1)

试试这个:

SELECT SUM(cnt)
FROM(SELECT tid, COUNT(DISTINCT a.data) cnt
     FROM tabel a 
     WHERE a.data IN ('C', 'F')
     GROUP BY tid HAVING COUNT(DISTINCT a.data) = 2
   ) AS A

答案 2 :(得分:1)

试试这个:

SELECT COUNT(*) FROM (
 SELECT tid,
   SUM(CASE 
       WHEN `data` LIKE '%C%' THEN 1 
       WHEN `data` LIKE '%F%' THEN 1 
       ELSE 0 
       END
   ) AS freq
 FROM `table`
 GROUP BY tid
 HAVING freq = 2
) t