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 |
+----+------+-----------+-----------+