我有两(2)个表,我正在尝试计算Table1中的所有记录,Table1_delta是来自Table1_delta的pagename尚未列入Table1。 Table1_delta中的Incase页面名称列在Table1中,status必须为1,以便它包含在计数结果中。
示例表结构:
表1
+-----------+--------+
| pagename | status |
+-----------+--------+
| pagename1 | 2 |
| pagename2 | 1 |
+-----------+--------+
Table1_delta
+-----------+
| pagename |
+-----------+
| pagename1 |
| pagename2 |
| pagename3 |
| pagename4 |
+-----------+
表格样本应返回“3”。
pagename3和pagename4未在Table1中列出(返回2),而Table1中的pagename2的status = 1(返回1)。总共有来自Table1_delta的 3个页面名称未在表1中列出,并且从Table1记录,其中status = 1.我想知道如何查询这个?我正在使用MySQL v5.6.17。谢谢!
答案 0 :(得分:1)
以下是使用连接的替代解决方案:
SELECT COUNT(*)
FROM Table1_delta t1 LEFT JOIN Table1 t2
ON t1.pagename = t2.pagename
WHERE t2.status IS NULL OR t2.status = 1
以下是上述查询中的临时表:
+-----------+--------+
| pagename | status |
+-----------+--------+
| pagename1 | 2 | # this row is NOT counted
| pagename2 | 1 | # +1 this row has status = 1 and is counted
| pagename3 | null | # +1 this row has status = null and is counted
| pagename4 | null | # +1 this row is also null and is counted
+-----------+--------+
请查看以下链接,了解正在运行的演示。
<强> SQLFiddle 强>
答案 1 :(得分:0)
如果我理解正确:
SELECT COUNT(*) FROM Table1_Delta
WHERE pagename NOT IN
(SELECT pagename FROM Table1 WHERE status = 1)
根据评论中的要求,此查询的作用如下:
首先,子查询:SELECT pagename FROM Table1 WHERE status = 1
从状态为1的pagename
条记录中检索Table1
字段。
因此,在示例中,它会返回包含pagename2
的单行。
然后主查询计算Table1_Delta
SELECT COUNT(*) FROM Table1_Delta
不包含(Pagename
)这些值的WHERE Pagename NOT IN (<subquery>)
(pagename1
)中的所有记录来自子查询。
所以这会匹配3个条目(pagename3
,pagename4
,float ff = 99.95f;
double dd = (double)(decimal)ff;
),这就是你获得的数量
历史上,使用子查询被认为比使用连接慢,但坦率地说,RDBMS已经在很长时间内优化了查询,对于像这样的简单情况,它可能是&#34;可能&#34; (我还没有测量过)更快。它实际上取决于真实的情况和数据库......但SQL代码比加入IMO更加不言自明。您的里程可能会有所不同。
答案 2 :(得分:0)
尝试使用连接
Select count(Table1_delta.pagename) from Table1_delta
INNER JOIN Table1 ON
Table1_delta.pagename != Table1 .pagename
AND Table1.status != 1