SQL在单个类别中选择产品

时间:2010-10-12 15:16:59

标签: sql mysql coldfusion

所以这就是我想要做的。我的老板想把我们所有的车辆放在我们的主页上,并一次随机拉出其中的8辆。我们设置数据库模式的方式是使用交叉引用将产品和类别放在单独的表中,以查找产品所属的类别。具有类别的表具有父级,该父级是来自另一个类别的直接ID。所以这是我想出的SQL。

  SELECT      product.productID, 
              product.productSKU, 
              product.price, 
              product.name,
             product.stateInd, 
              category.parentID,
              category.categoryID,
              prod_cat.productID FROM category

LEFT JOIN prod_cat
     ON prod_cat.categoryID = category.categoryID
LEFT JOIN product
     ON product.productID = prod_cat.productID

WHERE category.parentID =  <cfqueryparam value="#catID#" cfsqltype="cf_sql_varchar" /> AND product.name <> "" AND RAND() 

LIMIT 8

我希望一切都有道理。我只是在最艰难的时候不仅要拉8种产品,还要确保这8种产品都是独一无二的。哦,我确实尝试在选择之后放入DISTINCT,但产品仍然被选中两次。

谢谢!

3 个答案:

答案 0 :(得分:5)

DISTINCT应该有用。如果没有,请尝试group by productId。要选择随机行,请按rand()而不是where rand()构造进行排序。

结合两者:

WHERE  category.parentID = <cfqueryparam value="#catID#" cfsqltype="cf_sql_varchar"/>
       AND product.name <> ""
GROUP BY
       product.productID
ORDER BY
       RAND() 
LIMIT  8

答案 1 :(得分:0)

我会在子查询中提取8个唯一的产品,然后在查询的其余部分中使用它。

非常粗略的伪代码:

select ...
    from (select 8 distinct random product IDs from product table) p
        left join prod_cat
           on p.productID = prod_cat.productID
        left join category
           on prod_cat.categoryID = category.categoryID
    ...

答案 2 :(得分:0)

注意:Joe为了这个答案而打败了我,但我不确定如何将代码放在评论中,所以这是我的答案。

我不确定categoryID是否会为您的输入提供单行或多行,如果是单行,您可以使用=代替in

SELECT *
  FROM (SELECT * FROM product
         WHERE product.productID in (
            SELECT productID 
              FROM prod_cat
             WHERE categoryID in (  
                   SELECT categoryID 
                     FROM category 
                    WHERE parentID = 
                          <cfqueryparam 
                           value="#catID#" 
                           cfsqltype="cf_sql_varchar" /> 
                             )
               AND name <> ''
             ORDER BY rand()
             LIMIT 8
              ) p
INNER JOIN prod_cat ON p.productID=prod_cat.productID
INNER JOIN category ON prod_cat.categoryID=category.categoryID