【问题标题】:SQL Selection of products in a single categorySQL 选择单个类别中的产品
【发布时间】:2010-10-12 15:16:58
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: sql mysql coldfusion


    【解决方案1】:

    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
    

    【讨论】:

    • 好酷!我正在做更多的工作,并通过 rand 的东西弄清楚了订单……但它仍然在重复。就在那时我意识到我们有 2 件同名的产品,相同的图片只是不同的零件编号……如果这有意义:) 无论如何,我也会尝试按顺序订购!非常感谢! +
    【解决方案2】:

    我会在子查询中提取 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个产品,然后加入。
    • 好的!我也喜欢这种做法。这会提高性能吗?
    • @Nathan:测试并比较两个版本。
    【解决方案3】:

    注意:乔在这个答案上打败了我,但我不知道如何将代码放在评论中,所以这是我的答案。

    我不确定 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 版本不支持上述子查询的某些功能。绝对希望它会起作用想尝试一下:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多