【问题标题】:MYSQL JOIN. How to join only first match? (Join limit 1)MYSQL 加入。如何只参加第一场比赛? (加入限制1)
【发布时间】:2014-11-12 14:50:01
【问题描述】:

我有一个包含 1 000 000 条记录的表。 (t1) 有“选择查询”,速度非常快,并返回一个 ID 的单列结果。 (结果我只有唯一的 ID。例如:1,2,5,10,.. (没有重复值)

解释选择只显示我输入indexref(完美查询:))

但我需要通过这种方式从记录中过滤此结果: 与其他 1 000 000 个表的内部联接 (t2)

ON (`t1`.`some_column_id` = `t2`.`ref_id` AND `t1`.`user_id` = 4)

它显示了t1.some_column_id = t2.ref_id 的所有匹配项 即使我使用

GROUP BY `t1`.`some_column_id` AND/OR LIMIT of 30 ROWS

mysql 服务器失败

您将如何限制此 INNER JOIN 仅使用第一个匹配项?

【问题讨论】:

  • 请您指定您的 RDMS。另外,问题不太清楚,能否请您显示一个完整的查询?
  • @NBR 看看标签就知道了。
  • “第一场比赛”是什么意思?顺序是什么?
  • 使用SELECT [..] FROM t2 JOIN [subquery],子查询从t1 中只选择一行我认为应该很快。
  • 我考虑了一下,但是如果子查询返回 0..5000 条记录,这个查询的运行速度有多快?

标签: mysql sql performance join greatest-n-per-group


【解决方案1】:

有了可用的信息,我找到了这个解决方案。在如此大的数据库上执行这可能需要一些时间。我仍在寻找更好的选择。

假设字段“some_column_id”或“ref_id”不是唯一的。首先通过精确选择一个id(主键)和一些聚合函数(例如MIN())使它们唯一。像这样使用它:

SELECT tTwo.* FROM (SELECT notUnique, MIN(id) AS min FROM t GROUP BY notUnique) tOne INNER JOIN t AS tTwo ON (tTwo.id=tOne.min)

请注意,上述查询仅应用于一个表以使给定列唯一。

根据需要将其应用于表格后,您只需执行此操作

SELECT * FROM t1_unique INNER JOIN t2_unique ON (t1_unique.some_column_id = t2_unique.ref_id)

其中t1_uniquet2_unique 将分别具有some_column_idref_id 的唯一值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多