Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 - Fatal编程技术网

Mysql 使用三个表连接时的错误结果

Mysql 使用三个表连接时的错误结果,mysql,Mysql,我有三张桌子:出版商、印刷品和杂志。 一本杂志属于一个印记,而且只有一个印记。 印记属于一个出版商,并且只属于一个出版商。 出版商有许多印记 我试图查询所有的印记,从出版商那里获取数据,统计所有的杂志 我目前的尝试是: SELECT i.id, i.name, p.name as publisher, count(m.id) as magazines FROM imprint AS i JOIN publisher as p ON p.id = i.publisher LEFT

我有三张桌子:出版商、印刷品和杂志。 一本杂志属于一个印记,而且只有一个印记。 印记属于一个出版商,并且只属于一个出版商。 出版商有许多印记

我试图查询所有的印记,从出版商那里获取数据,统计所有的杂志

我目前的尝试是:

SELECT i.id, i.name, p.name as publisher, count(m.id) as magazines
FROM imprint AS i
    JOIN publisher as p ON p.id = i.publisher 
    LEFT INNER JOIN magazine as m  ON m.imprint = i.id
ORDER BY publisher ASC, i.name ASC
但结果我只得到了一行,并不是所有带有出版商名称和杂志数量的印记。
我哪里错了?

您得到一行的原因是countm.id。count是一个group函数,如果您不指定任何分组条件,它将聚合并计数所有检索行中给定表达式值的数量(在本例中为m.id)。因此,您应该按短语添加GROUP,并指定GROUP的条件。在这种情况下,更具体地说,inprintas的主键或唯一键应该是条件

让我假设您有以下表格:

出版商 印痕 杂志 那么查询应该是

MySQL [tmp]> SELECT imprintAS.id, imprintAS.name, publisher.name as publisher, count(magazine.id) as magazines
    -> FROM imprintAS
    -> JOIN publisher on publisher.id = imprintAS.publisher_id
    -> JOIN magazine ON magazine.imprint_id = imprintAS.id
    -> GROUP BY imprintAS.id
    -> ORDER BY publisher.id ASC, imprintAS.name ASC;
您将得到下面的结果

+----+------+-----------+-----------+
| id | name | publisher | magazines |
+----+------+-----------+-----------+
|  1 | i1   | p1        |         2 |
|  2 | i2   | p1        |         2 |
|  3 | i3   | p2        |         2 |
|  4 | i4   | p2        |         2 |
+----+------+-----------+-----------+

以p ON e.id=i.edition的身份加入publisher您真的应该将p中的外键与此处的某个内容相关联,我错在哪里这里:countm.id-可能缺少一个GROUP BY子句。左内部联接-这可能吗?来看看e的别名是什么?这不是你询问的非常好的答案。您还应该按发布者分组。如果两个印记具有相同的发布者,则您当前的查询无法返回正确的结果。实际上,这确实起到了预期的作用。唯一失败的是,它只检索下面有弹匣的印记,而不检索没有弹匣的印记。@Ikzer你是对的,左外连接以连接弹匣可以解决这个问题。
MySQL [tmp]> SELECT * FROM magazine;
+----+------------+------+
| id | imprint_id | name |
+----+------------+------+
|  1 |          1 | m1   |
|  2 |          1 | m2   |
|  3 |          2 | m3   |
|  4 |          2 | m4   |
|  5 |          3 | m5   |
|  6 |          3 | m6   |
|  7 |          4 | m7   |
|  8 |          4 | m8   |
+----+------------+------+
MySQL [tmp]> SELECT imprintAS.id, imprintAS.name, publisher.name as publisher, count(magazine.id) as magazines
    -> FROM imprintAS
    -> JOIN publisher on publisher.id = imprintAS.publisher_id
    -> JOIN magazine ON magazine.imprint_id = imprintAS.id
    -> GROUP BY imprintAS.id
    -> ORDER BY publisher.id ASC, imprintAS.name ASC;
+----+------+-----------+-----------+
| id | name | publisher | magazines |
+----+------+-----------+-----------+
|  1 | i1   | p1        |         2 |
|  2 | i2   | p1        |         2 |
|  3 | i3   | p2        |         2 |
|  4 | i4   | p2        |         2 |
+----+------+-----------+-----------+