sql - 对多个表进行 SELECT 查询

标签 sql mysql

我有两个表,foobar:

+----+-----+    +----+-----+
| id | val |    | id | val |
+----+-----+    +----+-----+
|  1 | qwe |    |  1 | asd |
|  2 | rty |    |  3 | fgh |
+----+-----+    +----+-----+

id 在这里不是唯一的。并非 foo 中的所有 ID 在 bar 中都有对应的 ID,反之亦然。我需要计算两个表中具有特定 ID 的所有行并将它们呈现在新表中,例如:

+----+-----------+-----------+
| id | count_foo | count_bar |
+----+-----------+-----------+
|  1 |         1 |         1 |
|  2 |         1 |         0 |
|  3 |         0 |         1 |
+----+-----------+-----------+

我尝试过UNION SELECT:

SELECT id, COUNT(id) AS count_foo, 0 AS count_bar FROM foo GROUP BY id
UNION SELECT id, 0, COUNT(id) FROM bar GROUP BY id;

但这会输出带有 id=1 的行两次,例如

+----+-----------+-----------+
| id | count_foo | count_bar |
+----+-----------+-----------+
|  1 |         1 |         0 |  <- not good
|  2 |         1 |         0 |
|  1 |         0 |         1 |  <- not good
|  3 |         0 |         1 |
+----+-----------+-----------+

我也尝试过LEFT JOIN:

SELECT id, COUNT(foo.id) AS count_foo, COUNT(bar.id) AS count_bar
FROM foo LEFT JOIN bar USING(id) GROUP BY id;

但是此查询会忽略表 bar 中的行,其 ID 在表 foo 中缺失:

+----+-----------+-----------+
| id | count_foo | count_bar |
+----+-----------+-----------+
|  1 |         1 |         1 |
|  2 |         1 |         0 |
+----+-----------+-----------+  <- can I haz `id=3`?

我错过了什么?正确的查询或正确的阅读手册是什么?

谢谢。

最佳答案

您可能想尝试以下操作:

SELECT d.id,
       (SELECT COUNT(*) FROM foo WHERE id = d.id) count_foo,
       (SELECT COUNT(*) FROM bar WHERE id = d.id) count_bar
FROM   ((SELECT id FROM foo) UNION (SELECT id FROM bar)) d;

测试用例:

CREATE TABLE foo (id int, val varchar(5));
CREATE TABLE bar (id int, val varchar(5));

INSERT INTO foo VALUES (1, 'qwe');
INSERT INTO foo VALUES (2, 'rty');
INSERT INTO bar VALUES (1, 'asf');
INSERT INTO bar VALUES (3, 'ghj');

结果:

+------+-----------+-----------+
| id   | count_foo | count_bar |
+------+-----------+-----------+
|    1 |         1 |         1 |
|    2 |         1 |         0 |
|    3 |         0 |         1 |
+------+-----------+-----------+
3 rows in set (0.00 sec)

关于sql - 对多个表进行 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3351706/

相关文章:

mysql - 在vb6中调用mysql查询

mysql - 使用 group_concat 如何将每个值迭代为一列

sql - 如何理解 SQLite `EXPLAIN QUERY PLAN` 结果?

php - 图像上传和操作,然后作为 blob 存储在数据库中失败

MySQL查询以获取开始日期和结束日期之间的结果

php - SQL 插入代码 PHP

mysql - 用于获取 ID1 的最新条目的 SQL 查询

MySQL 3 列唯一约束不起作用,可能是由于 NULL

MySQL查询效率建议

mysql - 搜索重复的大型地理空间数据库