【问题标题】:MySQL- Select only one matching recordMySQL - 只选择一个匹配的记录
【发布时间】:2020-09-11 06:33:20
【问题描述】:

我有一个表,它的主键是 4 列的组合,例如 column_1, column_2, column_3, column_4。此表中有一些记录具有多个值,用于<column_1, column_2> 值的相同组合。我想编写一个 SQL 查询,以便使用任意一个随机 column_3 和 column_4 组合选择不同的 column_1 和 column_2 组合。

示例: 表格

column_1          column_2          column_3  column_4
column_1_value_1  column_2_value_1  2000      america
column_1_value_1  column_2_value_1  1000      europe
column_1_value_2  column_2_value_2  3000      asia

我希望输出是

column_1_value_1  column_2_value_1  2000      america
column_1_value_2  column_2_value_2  3000      asia

column_1_value_1  column_2_value_1  1000      europe
column_1_value_2  column_2_value_2  3000      asia

我尝试了查询 select column_1, column_2, max(column_3), max(column_4) from table group by column_1, column_2 但这提供了输出:

column_1_value_1  column_2_value_1  2000      europe
column_1_value_2  column_2_value_2  3000      asia

此输出不正确,因为 column_3 值 2000 与 column_4 值 europe 不匹配。

有人可以根据我的要求帮我制定查询吗?

【问题讨论】:

  • " SELECT * FROM table_name GROUP By column_1, column_2 " 为什么你对 column_3 和 column_4 使用 max 并有具体要求。我只是根据需要触发上述查询及其输出。
  • max 与从列中获取随机值一样好,所以我使用了 max。
  • @bhargavkatakpara 您正在选择所有列,但仅按选定列分组。我认为这在概念上是不正确的
  • 好的,@sagar 明白了。

标签: mysql


【解决方案1】:

我们可以在这里使用ROW_NUMBER 作为 MySQL 8+ 选项:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY column_1, column_2 ORDER BY RAND()) rn
    FROM yourTable
)

SELECT column_1, column_2, column_3, column_4
FROM cte
WHERE rn = 1;

涉及连接并避免分析函数的解决方案可能如下所示:

SELECT t1.column_1, t1.column_2, t1.column_3, t1.column_4
FROM yourTable t1
INNER JOIN
(
    SELECT column_1, column_2, MAX(column_3) AS max_column_3
    FROM yourTable
    GROUP BY column_1, column_2
) t2
    ON t1.column_1 = t2.column_1 AND
       t1.column_2 = t2.column_2 AND
       t1.column_3 = t2.max_column_3;

第二种方法任意选择(column_1, column_2)单条记录作为column_3值最高的记录。

【讨论】:

  • 感谢蒂姆的回复。你能给我一个简单的 SQL 语法的解决方案吗?如果它涉及到表自身的连接,我没关系
  • 检查更新的答案,这与您最初尝试做的事情一致。
  • 我刚刚意识到,如果 Column_1、Columns_2、Column_3 有多个具有相同值的记录,这可能不起作用。作为答案发布了对您的解决方案的少量修改
【解决方案2】:

对蒂姆发布的答案稍作修改。

SELECT t1.column_1, t1.column_2, t1.column_3, max(t1.column_4)
FROM yourTable t1
INNER JOIN
(
    SELECT column_1, column_2, MAX(column_3) AS max_column_3
    FROM yourTable
    GROUP BY column_1, column_2
) t2
    ON t1.column_1 = t2.column_1 AND
       t1.column_2 = t2.column_2 AND
       t1.column_3 = t2.max_column_3
    GROUP BY t1.column_1, t1.column_2, t1.column_3;

【讨论】:

  • 请考虑删除此答案,因为它与实际提出的问题不符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多