count(*) 来自 2 个具有相同列的表
Posted
技术标签:
【中文标题】count(*) 来自 2 个具有相同列的表【英文标题】:count(*) from 2 tables with same columns 【发布时间】:2012-07-06 14:32:10 【问题描述】:我手头有一个奇怪的问题,我确信我的 SQL 很差。
问题如下:
我有 2 个表 table1 和 table2。这两个表都有相同的列集,即 ID 号、X 号、Y 号。这里 X 和 Y 的值为 0 或 1。
现在假设 ID 范围为 table1 中的 1-100 和 table2 中的 91-200:在 table1 中,X 具有所有 100 行的值,例如 1,而在同一个表中,Y 仅具有 90 的值1. Y 的下 10 个值即 91-100 在表 2 中。
现在,为各种查询调用 count(*),例如 X=1 和 Y=1、X=1 和 Y=0 等,我没有得到正确的值,因为 table2 中存在一组 Y 值。我正在查看 left Join 但不知何故我无法弄清楚这是否是正确的方法。
Table1
-------
Id X Y
1 1 1
2 1 1
3 1 1
4 1 0
5 1 0
Table2
-------
Id X Y
4 0 1
5 0 1
6 0 0
7 0 0
8 0 0
9 1 1
所以如果我说 X=1 和 Y=1,我应该得到 5 作为计数 (*)。
嗨贾斯汀, 让我解释一下实际情况。考虑 3 个进程 p1、p2 和 p3,它们有一个缓存,其中 P1、P2 和 P3 只是 X、Y 和 Z 列。这个缓存的内容就是 ID。如果 p1 转储和 Id 1 我会说 X=1 对于 ID=1 等。这些进程中的每一个都将缓存转储到一个组中,例如 g1 和 g2。我创建了一个关于 g1 和 g2 的表。所以g1代表table1,g2代表table2。 p1、p2 和 p3 中的每一个都有转储 100 个 ID 的限制。 P1 可能在 g1(table1) 中转储 ID 1-100,其中 p2 在 g1(table1) 中仅转储 90,在 g2(table2) 中转储 10,类似地,p3 会说在 g1(table1) 中转储 95 并休息5 在 g2(表 2)中。然而,p1、p2 和 p3 中的每一个都转储了 100 个 id,但在不同的组中。现在,如果我想在所有 P1、P2 和 P3 都在 g1 中转储缓存的理想情况下获得计数(),我会说从 g1 中获取 max(id),其中 P1=1 和类似地 min(id ) 来自 g1,其中 P1=1。我会写一个查询说“从 g1 中选择计数(),其中 X=1 和 Y=1 和 Z=1,其中 ID 介于 g1 的 min(id) 和 g1 的 max(id) 之间。在理想情况下如果它会返回 100。但在当前情况下它返回 90,这是不正确的。所以要解决这个问题,我还必须考虑 g2(table2) 中存在的 ID。
我希望这能回答你的问题。
谢谢 导航
【问题讨论】:
您能否尝试更清楚地了解您希望从这些表中获得哪些数据?我读了你的帖子几次,我不是很理解你的问题。 请显示您尝试过的查询,以及您对给定数据集的预期结果。 提供一些示例数据是一个好的开始。但是,现在,您必须告诉我们您对给定谓词的期望输出。 不幸的是,我并没有更接近理解您要问的内容。让我们继续使用您发布的示例数据——引入不同的数据集只会让事情变得更复杂。您是否只想考虑两个表中特定 id 的 max(x) 和 max(y)?给定谓词 x=0 和 y=0 的样本数据,您期望的计数 (*) 是多少? 3?还是5?还是别的什么? 【参考方案1】:听起来您想在应用谓词之前将两个表放在一起UNION
或UNION ALL
。类似的东西
SELECT COUNT(*)
FROM (SELECT id, x, y
FROM table1
UNION ALL
SELECT id, x, y
FROM table2)
WHERE x = 1
AND y = 1;
UNION ALL
将返回两个表中的每一行。 UNION
将消除重复行。
如果这不是您想要的,那么通过一个示例将非常有帮助,您可以在每个表中创建几行示例数据,并准确地向我们展示您想要的结果以及您如何获得该结果。
【讨论】:
@user1507003 - EDIT 您添加示例数据的问题 - 您可以使用
按钮format 编码(和数据),并且有有可能它是可读的。
嗨,贾斯汀,感谢您如此快速的回复。为了您的参考,我添加了一个示例数据。现在,如果您看到表 2 中存在列“Y”的数据,因此如果我想要 table1 中的正确计数 (),我需要考虑 table2 中的数据以及 ID 4 和 5 的数据在表 1 和表 2。我希望这能让它更清楚一些。因此,如果您看到要求是根据 ID 字段从 table1 中获取所有行并从 table2 中获取匹配行,然后为 X=1 和 Y=1 或 X=0 和 Y 获取计数() =0。
@user1507003 - 示例数据很有用。您现在需要编辑您的问题,以向我们准确解释您想要给定谓词的输出。例如,给定您发布的样本数据,您对谓词x=1 and y=1
的期望是什么count(*)
?为什么?为什么 table1
和 table2
的 id
值分别为 4 和 5 很重要?
嗨贾斯汀,非常感谢您的编辑和帮助。所以如果我说 X=1 和 Y=1 我应该得到 5 作为计数。
@user1507003 - 好的。现在你必须帮助我们解决“为什么”。 table1
中的三行具有 x=1 and y=1
,table2
中的零行具有 x=1 and y=1
。我假设您要计算 id
4 和 5,因为它们在 table1
中有 x=1
,在 table2
中有 y=1
。您是否只想考虑两个表中特定id
的max(x)
和max(y)
?您对谓词x=0 and y=0
的期望是什么count(*)
? 3?还是 5 个?【参考方案2】:
SELECT COUNT(*)
FROM
(SELECT ID, MAX(X) X, MAX(Y) Y
FROM
(SELECT *
FROM TABLE1
UNION ALL
SELECT *
FROM TABLE2)
GROUP BY ID)
WHERE X = 1 AND Y = 1
或者,如果您想使用高级 group by 子句
SELECT COUNT(*)
FROM
(SELECT *
FROM TABLE1
UNION ALL
SELECT *
FROM TABLE2)
HAVING MAX(X) = 1 AND MAX(Y) = 1
GROUP BY ID
【讨论】:
以上是关于count(*) 来自 2 个具有相同列的表的主要内容,如果未能解决你的问题,请参考以下文章
消息:未定义的索引:获取列名时(两个具有相同列的表)Codeigniter