【问题标题】:MySQL efficient join with "in" without duplicatesMySQL 使用“in”高效连接且不重复
【发布时间】:2015-10-20 04:53:07
【问题描述】:

我有一个event

+----------+------------+
| event_id | event_name |
+----------+------------+
|        1 | event1     |
|        2 | event2     |
|        3 | event3     |
|        4 | event4     |
+----------+------------+

还有一个event_performer

+--------------------+----------+--------------+
| event_performer_id | event_id | performer_id |
+--------------------+----------+--------------+
|                  1 |        1 |            1 |
|                  2 |        1 |            2 |
|                  3 |        2 |            1 |
|                  4 |        2 |            2 |
|                  5 |        3 |            3 |
|                  6 |        3 |            4 |
|                  7 |        4 |            3 |
|                  8 |        4 |            4 |
+--------------------+----------+--------------+

我想获取执行者 ID 为 1 和 2 的所有事件,因此我运行以下查询:

select event.* from event
join event_performer
on event.event_id = event_performer.event_id 
and performer_id in (1,2)
order by event_name

当我这样做时,我显然会得到重复的事件(两个用于 event_id 1,两个用于 event_id 2)。 MySQL 中删除重复项以便我获取每个事件记录一次的最有效方法是什么?

一个想法是使用select distinct event.* 处理大量字段和记录的效率如何?

请注意,示例表过于简单。每个表都有更多的字段和更多的记录。

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    您可以尝试使用 Group BY

    select event.event_id, event.event_name from event
    join event_performer
    on event.event_id = event_performer.event_id 
    and performer_id in (1,2)
    GROUP BY event_name, event.event_id
    order by event_name
    

    但是请注意,如果您在列上创建了索引,则使用 GROUP BY 类似于​​使用 DISTINCT。但是,如果您还没有创建索引,那么我建议您使用 DISTINCT,因为它比 GROUP BY 相对快。

    【讨论】:

    • 谢谢。就我而言,我选择了事件表中的所有字段(有很多)。整个列表是否应该同时包含在 select 语句和 group by 语句中?
    • 当你说索引时,如果有很多字段,你指的是什么索引?只是主键还是多列索引?
    • @stepanian:- 是的,您尝试检查重复项的列上的索引。您可以参考:What's faster, SELECT DISTINCT or GROUP BY in MySQL?
    • 字段event_id是主键,auto_increment,所以是索引。我可以只按 event_id 分组,还是应该分组包括所有列?
    • @stepanian:- 在这种情况下,我建议您使用 DISTINCT,因为它比 GROUP BY 更快。但是,如果您使用的是 GROUP BY,那么是的,您必须列出所有列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2015-12-31
    • 2017-01-27
    • 2017-01-01
    • 1970-01-01
    • 2020-12-12
    • 2018-06-08
    相关资源
    最近更新 更多