2012-01-02 37 views
1

好吧,它的晚了,所以这可能很明显,但我遇到了一些麻烦。MySQL计数值(使用group by?)基于2个表

我有2个表格。

Filter 
- 

id 
catId 
value 

所有的值应该是唯一的,这样这个查询得到所有的价值观和他们的 “ID” S

select value as prodVal, id 
from Filter 
where catId = 7 group by prodVal 

该查询返回此...

id = 82, value = 'filter1' 
id = 92, value = 'filter2' 
etc.. etc... 

我需要然后将该“id”列表并在第二张桌子上处理,即

prodFilters 
- 
id 
filterId 
productId 

所以我需要算多少“FilterID”的出现次数在“prodFilters”的存在对于在之前的查询拉升每一个“ID” ......

FOREACH(ID从以前的查询)做.. 。

select count(*) from prodFilters 
where filterId = {value from last query} 
group by filterId 

有没有什么办法让这一切都通过一个查询来完成,而不是在运行第一查询,然后后运行多个查询?

任何帮助,非常感谢。

+0

不知道我理解使用'组by'没有聚合功能的原因是什么? AFAIK不可能这样做 – Sathya 2012-01-02 10:04:00

+0

@Sathya:'SELECT f FROM GROUP BY f'与'SELECT DISTINCT f FROM a'相同。是的,这是可能的。 – 2012-01-02 10:09:43

+1

@ypercube虽然我知道这是可能的,但是我不知道MySQL允许'SELECT x,y从GROUP BY z'与'SELECT DISTINCT x,y from a'相同吗?Oracle会在那里发出错误 – Sathya 2012-01-02 10:15:37

回答

0
select count(p.id) , p.filderId from prodFilters as p , filter as f 
where p.filterId = f.id and f.catId = 7 
group by p.filterId 

,我认为这会工作,因为每个CATID,值是唯一场

1

您正在寻找这样的事情?

select Filter.value as prodVal, Filter.id , count(filterId) from prodFilters, Filter where filterId IN (select id from Filter where catId = 7) group by filterId 
+0

这将返回一个170的计数,它应该是4. – 2012-01-02 10:28:29

+0

请尝试编辑的并让我知道。 – redmoon7777 2012-01-02 10:36:47

3

您应该能够使用IN条款

SELECT filterid, COUNT(*) 
FROM prodfilters 
WHERE filterid IN (SELECT id 
        from Filter 
        WHERE catid = 7 
        group by prodVal) 
GROUP BY filterid 
+0

有2个表格,我只在这个查询中看到一个表格。不,它不工作,我想要它。 – 2012-01-02 10:27:40

+0

老兄,你的编辑让它根本不起作用 – 2012-01-02 10:33:18

+0

@BrianPatterson在两个表上都有一些示例数据会很有帮助。无论如何现在试试。 – Sathya 2012-01-02 10:44:51

0

您可以像使用

With A as { 

select value as prodVal, id 
from Filter 
where catId = 7 group by prodVal 

} 
select count(*) from prodFilters 
where filterId in {A.id} 
group by filterId 

这工作在Oracle不错,但不知道MySQL的

MySQL的:

SELECT COUNT (*) 
    FROM prodfilters t 
     JOIN 
     (SELECT VALUE AS prodval, ID 
       FROM filter 
      WHERE catid = 7 
      GROUP BY prodval) ta ON ta.ID = t.filterid 
GROUP BY filterid 
+0

MySQL中没有CTE。 – 2012-01-02 10:17:59

+0

这不适用于MySQL。不知道为什么它成了upvoted。 – 2012-01-02 10:27:58

+0

由于“GROUP BY prodVal”和“SELECT id”,它不适用于任何其他DBMS。 – 2012-01-02 10:34:49

2

试试这个:

Select f.value as prodVal, f.id, Count(pf.filterId) as 'Filter Count' 
From Filter f 
inner join prodFilters pf on f.id = pf.filterId 
where f.catId = 7 
group by pf.filterId 
1
select count(filterid) 
from prodfilters where id in (select value as prodVal, id 
    from Filter 
    where catId = 7 group by prodVal) as temp 
    group by id 
0

您可以使用此查询

select COUNT(*) from filter as f left outer join prodFilter as p on f.Id = p.filterId 
1
SELECT catId, COUNT(*) 
FROM prodFilters 
WHERE catId IN (SELECT id from Filter 
        WHERE catId = 1) 
GROUP BY catId 
+0

感谢您的全力帮助。最后,我根据你的一些建议,自行解决了答案。再次感谢! – 2012-01-02 10:41:55