繁体   English   中英

MySQL查询返回的行比预期的多,我如何仅从每个组返回一列的最大值?

[英]MySQL query returns more rows than intended, how do i only return the highest value of one column from each group?

该查询需要返回“ sheet_ID”列的每组中具有“ revision”列最高值的所有行。 当我不执行OR语句但我需要能够使用它们时,它会很好地工作。 输入字段用于“项目编号”,or语句需要从可能的10列中拉出该编号。

这是我的查询语句:

SELECT item_no, item_no1, item_no2, item_no3, item_no4, item_no5, item_no6,
       item_no7, item_no8, item_no9, style, vendor_code, pgc, buyer, brand,
       product_name, sheet_ID, revision, id
FROM product_sheets
WHERE item_no LIKE '$value' or item_no1 LIKE '$value' or
      item_no2 LIKE '$value' or item_no3 LIKE '$value' or
      item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
      item_no6 LIKE '$value' or item_no7 LIKE '$value' or
      item_no8 LIKE '$value' or item_no9 LIKE '$value' AND
      revision IN (SELECT MAX(revision)
                   FROM product_sheets
                   GROUP BY sheet_ID
                  );

代替这个:

 revision IN (SELECT MAX(revision)
               FROM product_sheets
               GROUP BY sheet_ID
              );

您需要一个相关的子查询。 就您而言,您可以将其编写为:

 revision = (SELECT MAX(ps2.revision)
              FROM product_sheets ps2
              WHERE ps2.sheet_ID = product_sheets.sheet_ID
             );

但是,我强烈建议您在外部查询中使用表别名。

您还需要在以下where修复括号:

WHERE (item_no LIKE '$value' or item_no1 LIKE '$value' or
       item_no2 LIKE '$value' or item_no3 LIKE '$value' or
       item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
       item_no6 LIKE '$value' or item_no7 LIKE '$value' or
       item_no8 LIKE '$value' or item_no9 LIKE '$value'
      ) AND
      revision = (SELECT MAX(ps2.revision)
                  FROM product_sheets ps2
                  WHERE ps2.sheet_ID = product_sheets.sheet_ID
                 );

如果$value不使用通配符,则更简单地写为:

where '$value' in (item_no, item_no1, item_no2, . . .) and
      revision = (SELECT MAX(ps2.revision)
                  FROM product_sheets ps2
                  WHERE ps2.sheet_ID = product_sheets.sheet_ID
                 );

并且,除了有关规范化的注释(强烈建议)外,您还需要学习有关使用查询参数将值传递给查询的知识。

因此必须将日方括号or条件,没有他们只有最后一个条件item_no9 LIKE '$value'与一个与运营商相关的IN条件。

WHERE (item_no LIKE '$value' or item_no1 LIKE '$value' or
      item_no2 LIKE '$value' or item_no3 LIKE '$value' or
      item_no4 LIKE '$value' or item_no5 LIKE '$value' or 
      item_no6 LIKE '$value' or item_no7 LIKE '$value' or
      item_no8 LIKE '$value' or item_no9 LIKE '$value'
      )

另外,将IN条件更改为以下内容。
您不希望不是与其sheet_ID的最大修订版匹配的修订版与另一个sheet_ID的最大修订版匹配。

      AND (sheet_ID,revision) IN (SELECT sheet_ID,MAX(revision)
                                  FROM product_sheets
                                  GROUP BY sheet_ID
                                  );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM