如果我有这样的表:
id column1 column2
1 A A
1 B B
1 C A
2 B A
2 B C
2 C C
3 D C
3 B D
3 E D
我想要的是计算不包含column1 = A或column2 = A的不同ID。
从我的表中,count(distinct(id))应为1,因为id 1的行包含column1 = A,column2 = A和id 2,column2 = A.所以id 3是行中不包含column1!= A或column2!= A的唯一ID。
我应该使用哪种查询?
答案 0 :(得分:2)
这可能会对你有帮助;)
MySQL 5.6架构:
CREATE TABLE SO_TEST (
id int,
column1 char(2),
column2 char(2)
);
INSERT SO_TEST VALUES
(1,'A','A'),
(1,'B','B'),
(1,'C','A'),
(2,'B','A'),
(2,'B','C'),
(2,'C','C'),
(3,'D','C'),
(3,'B','D'),
(3,'E','D');
查询1 :
SELECT COUNT(1) AS RESULT
FROM (
SELECT id, GROUP_CONCAT(CONCAT(CONCAT(column1,','),column2)) STR FROM SO_TEST GROUP BY id
) TMP
WHERE FIND_IN_SET('A',TMP.STR) = 0
好的,我们来解释一下。
在子查询中,我按组ID和column1
检索了所有column2
,concat
值,它会返回我们的结果,您可以在sqlfiddle。
+----+-------------+ | id | STR | +----+-------------+ | 1 | A,A,B,B,C,A | | 2 | B,A,B,C,C,C | | 3 | D,C,B,D,E,D | +----+-------------+
所以在主查询中,我在FIND_IN_SET(param1, param2)
子句中使用了WHERE
,此函数会在 param2 param1 的索引>(param2的每个元素必须用逗号分隔),如果 param1 不在 param2 中,则返回0,所以我们可以清楚WHERE
子句。
最后count(1)
将帮助我们获得我们想要的东西。
<强> Results 强>:
| RESULT |
|--------|
| 1 |
答案 1 :(得分:1)
你可以做这样的事情,它会返回当column1与'A&#39; A&#39;分开时按ID分组的行数。和column2与&#39; B&#39;:
不同SELECT COUNT(*) as cont
FROM test
WHERE column1 != 'A' AND column2 != 'A'
GROUP BY id
在您的示例中将返回:
id cont
1 1
2 2
3 3
因为id 1只有(B,B)作为一个好的值,id 2有(B,C)和(C,C),id 3都是一个好的值。
希望它会对你有所帮助。
答案 2 :(得分:1)
据我所知,$search_term
$query = $db->getConnection()->prepare("SELECT * FROM `coils` WHERE coil_name IS LIKE '%:search_term%' ORDER BY id DESC LIMIT {$start}, {$perPage}");
$query->execute(array(
':search_term' => $search_term
));
echo $query->rowCount()
输出
distinct IDs