Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 SQL连接和左外部连接:为什么结果不同?_Mysql_Sql - Fatal编程技术网

Mysql SQL连接和左外部连接:为什么结果不同?

Mysql SQL连接和左外部连接:为什么结果不同?,mysql,sql,Mysql,Sql,我有一张桌子partenaire。合作伙伴可以有一个或多个地址。当然,一个地址可能“属于”多个合作伙伴。所以我有三个表:partenaire,partenaire\u-adrese和adrese。该地址只有一个城镇(ville法语),因此我在表address中有一个外键id\u ville SELECT p.nom, v.nom, v.id_region as id_r, v.id_departement as id_p, r.description as region

我有一张桌子
partenaire
。合作伙伴可以有一个或多个地址。当然,一个地址可能“属于”多个合作伙伴。所以我有三个表:
partenaire
partenaire\u-adrese
adrese
。该地址只有一个城镇(
ville
法语),因此我在表
address
中有一个外键
id\u ville

SELECT
    p.nom,
    v.nom, v.id_region as id_r, v.id_departement as id_p,
    r.description as region
FROM partenaire p
JOIN partenaire_adresse pa
    ON pa.id_partenaire=p.id
JOIN adresse a
    ON a.id=pa.id_adresse
JOIN ville v
    ON v.id=a.id_ville
JOIN region r
    ON v.id_region=r.id
LIMIT 4;
这给了我这些结果:

+----------------------------+-------------+------+------+--------+
| nom                        | nom         | id_r | id_p | region |
+----------------------------+-------------+------+------+--------+
| Ferme Auberge Christlesgut | Breitenbach |    1 |    2 | Alsace | 
| Alice Pizza                | Strasbourg  |    1 |    1 | Alsace | 
| Au Vieux Cellier           | Strasbourg  |    1 |    1 | Alsace | 
| Auberge du 7Eme Art        | Strasbourg  |    1 |    1 | Alsace | 
+----------------------------+-------------+------+------+--------+
现在,如果我在最后一个表(
region
)上执行
左外部联接,结果不一样:

SELECT
    p.nom,
    v.nom, v.id_region as id_r, v.id_departement as id_p,
    r.description as region
FROM partenaire p
JOIN partenaire_adresse pa
    ON pa.id_partenaire=p.id
JOIN adresse a
    ON a.id=pa.id_adresse
JOIN ville v
    ON v.id=a.id_ville
LEFT OUTER JOIN region r
    ON v.id_region=r.id
LIMIT 4;
结果不一样。见:

+---------------------+----------+------+------+----------------+
| nom                 | nom      | id_r | id_p | region         |
+---------------------+----------+------+------+----------------+
| 'Le 144' Petrossian | Paris 18 |   12 |   43 | Île-de-France  | 
| 'Le 144' Petrossian | Paris 08 |   12 |   43 | Île-de-France  | 
| 'O'Quai'            | Vouvray  |    7 |   26 | Centre         | 
| 'O'Quai'            | Tours    |    7 |   26 | Centre         | 
+---------------------+----------+------+------+----------------+

我认为不应该这样做,因为在第一个查询中,id\u region和id\u department不为null,所以如果执行“连接”或“左外连接”,结果应该是相同的。还是我遗漏了什么?

您遇到的问题与以下事实有关:当没有指定顺序时,SQL无法保证结果的顺序。如果添加ORDER BY子句,应该会得到相同的结果,前提是表的所有行上都有匹配的键(当然)。

在每个查询中添加ORDER BY,以便根据前面的一些记录进行任何有意义的比较。我添加了“ORDER BY p.nom”,这两种方法都适用。我不明白的是,partenaire表的“nom”上有一个键,使用“join”需要28.9秒,使用“left outer join”需要0.10秒!怎么回事?老实说我不知道。没有命令的时间安排是什么样的?您可以尝试在两个查询上使用
EXPLAIN
,以查看它们的计划差异。
EXPLAIN
的+1。我试试这个。至于“无订单者”,它花费了0.10秒。有趣的是,请随时发布您的发现作为您问题的更新,或者如果没有现有的同等问题,请提出新问题。