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
我拉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
...
我正要发布相同的内容。先选择8个产品,然后再加入。 – 2010-10-12 15:33:28
好的!我也喜欢这个。这会提高性能吗? – 2010-10-12 15:36:17
@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
酷!谢谢我的男人肯定会看到有关测试两种方式!谢谢你的帮助。更新:只是试过了......不幸的是我的MySQL版本不支持上述子查询的一些功能。绝对希望它会工作想给这个尝试: - / – 2010-10-12 16:00:56
好清凉!我正在做更多的工作,并得到了兰特的订单......但它仍然是重复的。那时候我意识到我们有两个产品具有相同的名称,相同的图片只是不同的零件编号......如果这是有道理的:)反正我也会按顺序尝试顺序!非常感谢! + – 2010-10-12 15:29:26