2012-10-12 65 views
0

可能重复:
COUNT() and DISTINCT can i use together?计算计数

我有这样的SQL语句:

SELECT * FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE (wp_term_relationships.term_taxonomy_id IN (4,3)) 
AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'published') 

,我得到两行用相同的ID =>预计

加入GROUP BY wp_posts.ID将行数减少到一个

现在我想获得的行的数量和SQL查询

SELECT COUNT(*) AS cnt FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE (wp_term_relationships.term_taxonomy_id IN (4,3)) 
AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'published') 
GROUP BY wp_posts.ID 

我会得到的结果是“2”,而不是“1” ,即使是“GROUP BY”。

从第一条语句中获取行数的正确语句是什么?

+0

你为什么期待'1'的结果? – Jocelyn

回答

1

试试这个:

SELECT count(DISTINCT wp_posts.ID) as cnt FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE (wp_term_relationships.term_taxonomy_id IN (4,3)) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'published') 

这会给你一个唯一的ID的计数结果行。

+0

谢谢!正是我在寻找的! – Xaver

+0

很高兴我帮了忙。干杯。 – raynix

0

由于第一个查询显示2行,因此第二个查询应该返回2,并且确实如此。这是正常的。

+0

是的第一个查询返回两行,但如果我添加“GROUP BY ID”我得到一个单一的行。如果我添加GROUP BY到第二个查询,我仍然得到两行 – Xaver

0

拥有GROUP BY并没有真正的逻辑意义。

一个简单的解决办法是使用你原来的SQL作为一个子查询,并以此为基础进行计数: -

SELECT COUNT(*) AS cnt 
FROM (SELECT wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships 
ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE (wp_term_relationships.term_taxonomy_id IN (4,3)) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'published') 
GROUP BY wp_posts.ID) Sub1 

或者如下因素可能会确定,这取决于表之间的关系(等如何唯一wp_posts.ID是)。

SELECT COUNT(DISTINCT wp_posts.ID) 
FROM wp_posts 
INNER JOIN wp_term_relationships 
ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE (wp_term_relationships.term_taxonomy_id IN (4,3)) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'published')