Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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_Performance - Fatal编程技术网

MySQL-同一表上的多个联接

MySQL-同一表上的多个联接,mysql,performance,Mysql,Performance,我有下面给出的表foo1 foo1 以及包含Id、代码和名称的销售人员表 推销员 正如您在表foo1中看到的,有3列(SentSalesmanId、OrderedSalesmanId和ConfirmedSalesmanId)与销售人员表相关 这是我的问题 SELECT f.Id, f.OrderId, f.OrderNote, s1.Code AS SentSalesmanCode, s2.Code AS OrderedSalesmanCode, s3.Code AS C

我有下面给出的表foo1

foo1

以及包含Id、代码和名称的销售人员表

推销员

正如您在表foo1中看到的,有3列(SentSalesmanId、OrderedSalesmanId和ConfirmedSalesmanId)与销售人员表相关

这是我的问题

SELECT
  f.Id,
  f.OrderId,
  f.OrderNote,
  s1.Code AS SentSalesmanCode,
  s2.Code AS OrderedSalesmanCode,
  s3.Code AS ConfirmedSalesmanCode
FROM
    foo1 f
INNER JOIN salesman s1 ON (s1.Id = f.SentSalesmanId)
INNER JOIN salesman s2 ON (s2.Id = f.OrderedSalesmanId)
INNER JOIN salesman s3 ON (s3.Id = f.ConfirmedSalesmanId);
这是我的预期输出

+----+---------+------------------+------------------+---------------------+-----------------------+
| Id | OrderId | OrderNote        | SentSalesmanCode | OrderedSalesmanCode | ConfirmedSalesmanCode |
+----+---------+------------------+------------------+---------------------+-----------------------+
|  2 |    1    | important order! |       S1001      |        S1002        |         S1003         |
+----+---------+------------------+------------------+---------------------+-----------------------+
这个查询给出了我想要的,但是对于大数据来说,它工作得很慢。我必须使用JOIN三次才能连接到销售人员表吗?我不能用一个连接来写它吗?或者有没有更有效的方法


谢谢。

您的查询没有问题。这应该很快。如果速度变慢,您可能需要确保表的索引正确

SHOW INDEX FROM foo1
SHOW INDEX FROM salesman 

如果你能把它们添加到你的问题中会很有帮助。然后,我们将为涉及的字段设置行和基数。

查询没有问题吗?不带WHERE、ORDER BY的查询。请向我们展示整个查询。每次显示都会在您有时间时创建表名和表名中的每个显示索引,有人会给您一个或两个想法。

您从未指定所需的输出。抱歉。问题已更新@tilz0r创建这三列的索引将有所帮助。尝试运行
EXPLAIN SELECT…
它将告诉您为什么速度慢。这是正确的连接方式。你有多少张唱片?@KemalGüler这没什么。。在这种情况下,当销售人员有许多记录时,可能会出现问题。尝试解释,然后尝试已有的查询,但作为子查询,父查询将只执行COUNT(*)。查询中可能没有问题,但在网络上可能没有问题。试着看一看percona工具包,这里有更多的分析工具。谢谢你的回答:)我仍然没有看到你表上的索引。请提供
SHOW CREATE TABLE
+----+---------+------------------+------------------+---------------------+-----------------------+
| Id | OrderId | OrderNote        | SentSalesmanCode | OrderedSalesmanCode | ConfirmedSalesmanCode |
+----+---------+------------------+------------------+---------------------+-----------------------+
|  2 |    1    | important order! |       S1001      |        S1002        |         S1003         |
+----+---------+------------------+------------------+---------------------+-----------------------+
SHOW INDEX FROM foo1
SHOW INDEX FROM salesman