Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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
mysql:获取独特产品的更简单、更高效的查询_Mysql_Sql_Database_Query Optimization - Fatal编程技术网

mysql:获取独特产品的更简单、更高效的查询

mysql:获取独特产品的更简单、更高效的查询,mysql,sql,database,query-optimization,Mysql,Sql,Database,Query Optimization,我想优化我的数据库查询,但我不知道如何做到这一点 我想得到一个商店的产品意见列表,按意见日期从最新到最老排序,但产品必须是独一无二的 例如,有3个用户:U1、U2、U3 该市有2家商店: S1与产品P11、P12、P13、P14 S2与产品P21、P22、P23、P24 用户添加了一些意见,最新的在顶部,最老的在底部: U1: P22 U1: P13 U2: P21 U3: P13 U2: P23 U1: P23 我想要实现的是: U1: P22 U1: P13 U2: P21 U2: P2

我想优化我的数据库查询,但我不知道如何做到这一点

我想得到一个商店的产品意见列表,按意见日期从最新到最老排序,但产品必须是独一无二的

例如,有3个用户:U1、U2、U3

该市有2家商店:

S1与产品P11、P12、P13、P14 S2与产品P21、P22、P23、P24 用户添加了一些意见,最新的在顶部,最老的在底部:

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
";

您可以尝试按产品id分组,也可以按产品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

我不知道您是否认为它更简单,并且忽略$addtosql,但您可以这样做

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 
  JOIN
     (
      SELECT product_id
           , max(created_on) created_on
        FROM app_products_opinion
       WHERE show_on_list = 1
         AND (added_by = 'M' OR status = 1)
       GROUP 
          by product_ID
      )  x
      ON a.created_on = x.created_on
     AND a.product_id = x.product_id
     AND a.show_on_list = 1
     AND a.store_ID = 'N'  
     AND a.photo != '' 
     AND (a.added_by = 'Z' OR a.status = 1)