所以这就是我想要做的。我的老板想把我们所有的车辆放在我们的主页上,并一次随机拉出其中的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,但产品仍然被选中两次。
谢谢!
答案 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