2013-04-28 42 views
2

嗨家伙,我一直试图弄清楚这一点了几个小时,但我似乎无法环绕它我的头..MySQL的搜索行的基础并

看看这个SQL表..

enter image description here

我试图寻找存在于所有filter_cat_id的,所以在这个例子将它的product_id 30的product_id,因为它与filter_cat_id 1 2和3的存在.. PRODUCT_ID 30存在于相同的filter_cat_id两次,否则我只是计数产品ID,然后是不同的猫ID,并确保计数的匹配。

任何想法?这可能在MySQL?另一种选择是使用PHP。

谢谢!

+0

请发表您的SQL代码,所以我们可以帮助你更好。 – GregD 2013-04-28 05:20:29

回答

1

我试图寻找存在于所有filter_cat_id的一个PRODUCT_ID,因此在本例中是PRODUCT_ID 30,因为它与filter_cat_id 1 2和3

一般存在,这可以通过PRODUCT_ID分组,并使用HAVING COUNT(product_id) >= x来完成 - 在X是类别的数量,

SELECT product_id FROM table GROUP BY product_id HAVING COUNT(product_id) >= 3 

如果你不知道类别数前期(从而y您可以同时插入的实际数量到查询),就可以得到该值与子查询,

SELECT product_id FROM table GROUP BY product_id 
    HAVING COUNT(product_id) >= (SELECT COUNT(DISTINCT category_id) FROM table) 

编辑:好吧,显然category_ids搜索来自某种搜索表单/过滤器机制。

在这种情况下,必须添加项目的过滤 - 并且要比较的数字必须隐式嵌入,但这应该不成问题。

SELECT product_id FROM table 
    WHERE category_id IN(1,2,3) 
    GROUP BY product_id 
    HAVING COUNT(product_id) >= 3 
+0

这就是如果他们使用所有的类别。 – 2013-04-28 05:25:43

+0

正确,让我调整我的答案。 – CBroe 2013-04-28 05:28:45

+0

但是..产品ID可以多次存在于同一类别中。我可能有4个product_id,它们都存在于相同的类别ID中。他们是一种消灭具有相同product_id和category_id的行的方法吗? – user933791 2013-04-28 05:30:29

0

这应该足够聪明以确定不同类别的数量,并选择具有该数量不同类别的product_id。

SELECT product_id 
FROM 
    (SELECT DISTINCT product_id, filter_cat_id 
    FROM test.play) a 
GROUP BY product_id 
HAVING count(product_id) = (SELECT count(DISTINCT filter_cat_id) FROM test.play) 
; 

测试数据:

enter image description here

Query Result: 
30 
40 
1
SELECT 
    product_id, count(i.product_id) as t 
FROM 
    (SELECT 
     * 
    FROM 
     tablename 
    GROUP BY product_id , filter_cat_id) as i 
GROUP BY product_id 
HAVING t = 3