首页 > 解决方案 > mysql:获取独特产品的更简单、更有效的查询

问题描述

我想优化我的数据库查询,但我不知道该怎么做。

我想获取商店的产品意见列表,按意见日期(从最新到最旧)排序,但产品必须是唯一的。

例如,有 3 个用户: U1U2U3

市内有2家店:

用户添加了一些意见(最新的在顶部,最旧的在底部):

U1: P22
U1: P13
U2: P21
U3: P13
U2: P23
U1: P23 

我想要实现的是:

U1: P22
U1: P13
U2: P21
U2: P23

我创建的查询很长而且有点复杂。我可以以某种方式简化它吗?


$sql_query = "
SELECT a.*
     , b.name AS 'store_name'
     , b.city AS 'store_city'
     , c.name AS 'product_name'
  FROM `app_products_opinion` AS a 
  JOIN `app_products_stores` AS b 
    ON a.store_ID = b.ID 
  JOIN `app_products` AS c 
    ON a.product_ID = c.ID 
 WHERE a.created_on IN
    (
        SELECT max(created_on) as created_on
        FROM app_products_opinion
        WHERE show_on_list='1' AND (added_by='".$_SESSION["CMSUserID"]."' OR status = '1')
        GROUP by product_ID
        ORDER by created_on DESC
     ) 
     AND a.show_on_list='1' 
     AND a.store_ID='".$id_store['ID']."' $addtosql 
     AND a.photo != '' 
     AND (a.added_by='".$_SESSION["CMSUserID"]."' OR a.status='1') 
     ORDER BY a.created_on DESC
";

标签: mysqlsqldatabasequery-optimization

解决方案


您可以尝试按 product_id 分组,也可以按 product_ID 和日期加入(简化代码)

 SELECT a.user_id, a.product_ID 
 from app_products_opinion a 
 INNER JOIN ( 
    SELECT product_ID, max(created_on) as created_on
    FROM app_products_opinion
    WHERE show_on_list='1' AND (added_by='".$_SESSION["CMSUserID"]."' OR status = '1')
    GROUP by product_ID
    ORDER by created_on DESC
 ) t on a.created_on = t.created_on 
    AND a.product_ID = t.product_ID

推荐阅读