获取非重复记录的最大值

get max value of non duplicated records

这可能吗? 我有以下 table:

Col1 Col2 col3
code1 US 9
code1 0 5
code2 US 4
code2 0 11
code3 0 11

我正在尝试通过 col1 和 col2 过滤更高的 col3 值我现在的尝试是:

SELECT MAX(col3), col2, col1, count(col1) FROM `mytable` WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')) GROUP BY col1;

我的结果:

Col1 Col2 col3 count(col1)
code1 US 9 2
code2 0 11 2

但我需要的是,如果两个代码都有一个值等于 'US' 的 col2,那么 return 中更高的 col3 值,并忽略带有“0”的那些

Col1 Col2 col3 count(col1)
code1 US 9 2

或者如果其中一个代码只有一行,col2 等于“0”,则比较 code1 = 'US' 和 code2 =“0”

Col1 Col2 col3
code1 US 9
code1 0 5
code2 0 11
code3 0 11

给出结果:

Col1 Col2 col3 count(col1)
code2 0 11 2

是否可以通过 mysql 查询来实现?或者我应该使用 php?

提前致谢。

您有非常具体的 where 子句,因此您需要像在 Main Select

中一样在子选择中重复它们

随着您的需求越来越复杂,您必须增加subselect的数量来满足您的要求,ORDER BYs决定被选中的行。

Followimg 为您提供结果,随着您添加越来越多的 obsticles,您也​​必须在代码中执行此操作

CREATE TABLE tab1 (
  `Col1` VARCHAR(5),
  `Col2` VARCHAR(2),
  `col3` INTEGER
);

INSERT INTO tab1
  (`Col1`, `Col2`, `col3`)
VALUES
  ('code1', 'US', '9'),
  ('code1', '0', '5'),
  ('code2', 'US', '4'),
  ('code2', '0', '11'),
  ('code3', '0', '11');
SELECT * FROM tab1 WHERE col3 = 
(SELECT MAX(col3) FROM tab1  WHERE (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0')))
AND (col1 IN ('code1', 'code2') ) AND ((col2 = 'US') OR (col2 = '0'))
ORDER BY col1,col2 DESC
LIMIT 1
Col1  | Col2 | col3
:---- | :--- | ---:
code2 | 0    |   11
SELECT
  col1,col2,col3
FROM
  (SELECT
      `Col1`, `Col2`, `col3`,
      ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2
  FROM(
      SELECT 
          * ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn
      FROM tab1) t1
  WHERE rn = 1) t2
WHERE rn2 = 1
col1  | col2 | col3
:---- | :--- | ---:
code1 | US   |    9
CREATE TABLE tab2 (
  `Col1` VARCHAR(5),
  `Col2` VARCHAR(2),
  `col3` INTEGER
);

INSERT INTO tab2
  (`Col1`, `Col2`, `col3`)
VALUES
  ('code1', '0', '5'),
  ('code2', 'US', '4'),
  ('code2', '0', '11'),
  ('code3', '0', '11');
SELECT
  col1,col2,col3
FROM
  (SELECT
      `Col1`, `Col2`, `col3`,
      ROW_NUMBER() OVER(ORDER BY col2 DESC,col3 DESC) rn2
  FROM(
      SELECT 
          * ,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col3 DESC) rn
      FROM tab2) t1
  WHERE rn = 1) t2
WHERE rn2 = 1
col1  | col2 | col3
:---- | :--- | ---:
code2 | 0    |   11

db<>fiddle here