我有一个简单的报告发送框架,它基本上做以下事情:它执行一个 SELECT 查询,它根据结果制作一些文本格式的表格,它发送一封电子邮件,它执行一个 UPDATE 查询。
该系统是旧系统的概括,其中所有操作都是硬编码的。但是,在将我想做的所有逻辑推入 SELECT 查询时,我遇到了一个问题。
以前,我可以通过以下方式获取文本表的大部分信息:
SELECT Name, Address FROM Databas.Tabl WHERE Status='URGENT';
然后,当我需要一个额外的电子邮件号码时,还可以:
SELECT COUNT(*) FROM Databas.Tabl WHERE Status='URGENT' AND TimeLogged='Noon';
现在,我不再有多个 SELECT 查询的奢侈了。我想做的是:
SELECT Tabl.Name, Tabl.Address, COUNT(Results.UID) AS Totals
FROM Databas.Tabl
LEFT JOIN Databas.Tabl Results
ON Tabl.UID = Results.UID
AND Results.TimeLogged='Noon'
WHERE Status='URGENT';
至少在我的脑海中,这表示要获得所有被选择的行的总数,并且还有一些条件。
但实际上,这给了我“1140 - 如果没有 GROUP BY,则混合没有 GROUP 列的 GROUP 列是非法的”错误。问题是,我不想 GROUP BY。我希望这个 COUNT 重复 SELECT 找到的 TimeLogged='Noon' 的结果数。或者我想删除 AND 子句,并在 SELECT 语句的结果中包含该 SELECT 语句找到的结果数作为列。
GROUP BY 不是答案,因为这会导致它仅获取在某些列中具有相同值的行的 COUNT。并且 COUNT 甚至可能不是解决此问题的方法,尽管这是我想到的。FOUND_ROWS() 不会起作用,因为它需要成为辅助查询的一部分,而我只得到一个(而且不涉及 LIMIT),而且 ROW_COUNT() 似乎不起作用,因为它是一个 SELECT 语句。
我可能完全从错误的角度接近它。但我想做的是在一个查询中获取有关 SELECT 查询结果的 COUNT 类型信息,以及 SELECT 查询返回的所有其他信息。
===这是我到目前为止所得到的===
SELECT Tabl.Name, Tabl.Address, Results.Totals
FROM Databas.Tabl
LEFT JOIN (SELECT COUNT(*) AS Totals, 0 AS Bonus
FROM Databas.Tabl
WHERE TimeLogged='Noon'
GROUP BY NULL) Results
ON 0 = Results.Bonus
WHERE Status='URGENT';
这确实使用了子 SELECT,我最初希望避免这种情况,但现在意识到这种希望可能是愚蠢的。另外,由于 COUNT 条件都在一个表上,因此 COUNTing SELECT 子查询的成本似乎低于主查询,但我正在使用的真正 SELECT 必须加入多个不同的表以获取派生信息。
关键的实现是我可以 GROUP BY NULL,这将返回一个结果,以便 COUNT(*) 实际上捕获所有内容,并且我可以通过在两个表上伪造一个带有 0 的 Bonus 列来强制与该列相关。
看起来这是我将使用的解决方案,但直到明天我才能真正接受它作为答案。感谢所有的帮助。