【问题标题】:How to find top rated 3 product from each category using mysql query如何使用 mysql 查询从每个类别中查找评分最高的 3 个产品
【发布时间】:2015-07-03 11:22:08
【问题描述】:

我有两张桌子: 1) 评分员 字段是:(1)id(2)userid(3)productid(4)rating

2) 产品主管 字段是:(1)id(2)productname(3)category(4)author

注意:满分 5 分 每当任何用户对任何产品进行评分时,我都会将记录插入到 ratemaster 表中,例如:1(id) 1002(userid) 995(productid) 4(rating) 对于每个用户,我都像上面一样存储数据。

产品主文件包含categorynameproduct name。 现在我想从每个类别中获得排名前 3 的产品我将如何编写 mysql 查询以实现以下输出

输出:

【问题讨论】:

  • 简单的答案是加入表格,通过降序将其限制为 3 顺序。如果你需要我可以写查询:)
  • 您是否尝试过自己编写任何代码,以便我们可以看到您自己设法完成了什么。
  • 感谢 rooshan .. 我试过了,但没有得到它。你能写一个对我有用的mysql查询吗
  • @RooshanAkthar LIMIT 在此查询中没有位置。
  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做(您还没有这样做),请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更容易地复制问题。 2. 如果您还没有这样做(同样,您还没有这样做),请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: php mysql core


【解决方案1】:

试试这个-

SELECT a.id,a.productname,a.category,a.rating 
   FROM (SELECT prd.id,prd.productname,prd.category,rt.rating, 
               CASE 
                 WHEN @category != prd.category THEN @rownum := 1 
                 ELSE @rownum := @rownum + 1 
               END AS rank,
               @category := prd.category AS var_category
          FROM productmaster prd 
          JOIN ratemaster rt ON rt.productid=prd.id 
          JOIN (SELECT @rownum := NULL, @category := '') r     
      ORDER BY prd.category,rt.rating DESC) a
      WHERE a.rank<4;

【讨论】:

    【解决方案2】:

    由于您添加了 PHP 标记,我建议您简单地计算所有条目的评分并从那里继续

    SELECT p.*, SUM(r.rating)/COUNT(r.rating) AS rating
    FROM productmaster p
    INNER JOIN ratemaster r ON p.id = r.productid
    GROUP BY p.id
    ORDER BY p.category, rating DESC
    

    这将为您提供每个产品的计算评级(总和/评级数量)。如果您只对每个类别的前 3 名感兴趣,请执行以下操作

    $top3 = array();
    while ($row = /*..fetch logic*/) {
        if (array_key_exists($row['categoryId'], $top3)) {
            $top3[$row['categoryId']] = array();
        }
        if (count($top3[$row['categoryId']]) >= 3) {
            //top 3 for this category are found because query is ordered
            continue;
        }
        $top3[$row['categoryId']][] = array(
            //id, name, ...
        );
    }
    

    【讨论】:

      【解决方案3】:
      SELECT * from ratemaster JOIN productmaster ON (ratemaster.id = product.id) order by rating DESC LIMIT 3  
      

      如果我理解正确,我认为这应该有效。希望有效

      【讨论】:

      • 我试过这个查询,但它只给出了三个记录。我想要每个类别中排名前 3 的产品..
      • 哦,我的错,没有从每个类别中看到。
      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多