SQL在一个类别中的产品选择

问题描述:

所以这就是我想要做的。我的老板想把我们拥有的所有车辆放在我们的主页上,并随机抽出8辆。我们的数据库架构的设置方式包含产品,并使用交叉引用来分类表单中的类别以查找产品所属的类别。带有类别的表格有一个来自另一个类别的直接ID。所以这里是我提出的SQL。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,但产品仍然选择了两次。

谢谢!

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 
+0

好清凉!我正在做更多的工作,并得到了兰特的订单......但它仍然是重复的。那时候我意识到我们有两个产品具有相同的名称,相同的图片只是不同的零件编号......如果这是有道理的:)反正我也会按顺序尝试顺序!非常感谢! + – 2010-10-12 15:29:26

我拉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 
    ... 
+0

我正要发布相同的内容。先选择8个产品,然后再加入。 – 2010-10-12 15:33:28

+0

好的!我也喜欢这个。这会提高性能吗? – 2010-10-12 15:36:17

+0

@Nathan:测试并比较两个版本。 – 2010-10-12 15:47:16

注:乔打我这个答案,但我不知道如何把代码中的注释,所以这里是我的答案。

我不知道的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 
+0

酷!谢谢我的男人肯定会看到有关测试两种方式!谢谢你的帮助。更新:只是试过了......不幸的是我的MySQL版本不支持上述子查询的一些功能。绝对希望它会工作想给这个尝试: - / – 2010-10-12 16:00:56