Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择单个类别中的产品_Sql_Mysql_Coldfusion - Fatal编程技术网

SQL选择单个类别中的产品

SQL选择单个类别中的产品,sql,mysql,coldfusion,Sql,Mysql,Coldfusion,这就是我要做的。我的老板想把我们所有的车辆都放在我们的主页上,一次随机抽取8辆。数据库模式的设置方式将产品和类别放在单独的表中,使用交叉引用来定位产品所属的类别。包含类别的表有一个父级,该父级是另一个类别的直接ID。下面是我提出的SQL SELECT product.productID, product.productSKU, product.price, product.name,

这就是我要做的。我的老板想把我们所有的车辆都放在我们的主页上,一次随机抽取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,但产品仍然被选择了两次


谢谢

DISTINCT应该有效。如果没有,请尝试按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
    ...

注意:Joe因为这个答案打败了我,但我不知道如何在注释中添加代码,所以这里是我的答案

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


好酷!我在做更多的工作,并得到了兰德公司的订单,但它仍然在复制。那时我才意识到我们有两款产品,名称相同,图片相同,只是零件号不同……如果这有意义的话:无论如何,我也会尝试按件订购!非常感谢+我正要发同样的。。先选择8个产品,然后进行连接。好的!我也喜欢这个。这会提高性能吗?@Nathan:测试并比较两个版本。酷!谢谢,我一定要考虑一下双向测试!谢谢你的帮助。更新:刚刚试用过……不幸的是,我的MySQL版本不支持上述子查询的某些功能。当然希望它能起作用。我想尝试一下:-/
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