Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL高效连接;在;没有副本_Mysql_Join - Fatal编程技术网

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,则必须列出所有列名。