MySQL高效连接;在;没有副本
我有一个MySQL高效连接;在;没有副本,mysql,join,Mysql,Join,我有一个事件表 +----------+------------+ | event_id | event_name | +----------+------------+ | 1 | event1 | | 2 | event2 | | 3 | event3 | | 4 | event4 | +----------+------------+ +--------------------+----------+
事件
表
+----------+------------+
| event_id | event_name |
+----------+------------+
| 1 | event1 |
| 2 | event2 |
| 3 | event3 |
| 4 | event4 |
+----------+------------+
+--------------------+----------+--------------+
| 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 |
+--------------------+----------+--------------+
和一个事件执行者表
+----------+------------+
| event_id | event_name |
+----------+------------+
| 1 | event1 |
| 2 | event2 |
| 3 | event3 |
| 4 | event4 |
+----------+------------+
+--------------------+----------+--------------+
| 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
当我这样做时,我显然得到了重复的事件(两个用于事件\u id 1,两个用于事件\u id 2)。MySQL中最有效的方法是什么来删除重复项,这样我就可以获得每个事件记录一次
一种方法是使用选择不同的事件。*
对于大量字段和记录,这种方法的效率有多高
请注意,示例表过于简化。每个表都有更多的字段和更多的记录 您可以尝试使用分组方式
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
但是请注意,如果您已经在列上创建了索引,那么使用GROUPBY类似于使用DISTINCT。但是如果您还没有创建索引,那么我建议您使用DISTINCT,因为它比GROUP BY更快。您可以尝试使用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
但是请注意,如果您已经在列上创建了索引,那么使用GROUPBY类似于使用DISTINCT。但是如果您还没有创建索引,那么我建议您使用DISTINCT,因为它比GROUP BY快得多。谢谢。在我的例子中,我选择事件表中的所有字段(有很多)。整个列表是否应该同时包含在select语句和GROUPBY语句中?当您说索引时,如果有许多字段,您将引用哪个索引?只有主键还是多列索引?@stepanian:-是的,您试图检查重复项的列上的索引。您可以参考:字段event_id是一个主键,自动递增,因此它是一个索引。我可以只按事件id分组,还是应该按包含所有列的方式分组?@stepanian:-在这种情况下,我建议您使用DISTINCT,因为它比group by更快。但是如果您使用的是GROUP,那么您必须列出所有列名。谢谢。在我的例子中,我选择事件表中的所有字段(有很多)。整个列表是否应该同时包含在select语句和GROUPBY语句中?当您说索引时,如果有许多字段,您将引用哪个索引?只有主键还是多列索引?@stepanian:-是的,您试图检查重复项的列上的索引。您可以参考:字段event_id是一个主键,自动递增,因此它是一个索引。我可以只按事件id分组,还是应该按包含所有列的方式分组?@stepanian:-在这种情况下,我建议您使用DISTINCT,因为它比group by更快。但如果您使用的是GROUP BY,则必须列出所有列名。