使用 UNION ALL 从多个表中返回单个结果字段值作为结果数据集中记录的一部分

Returning a single result field value as part of a record in a resulting data set from multiple tables using UNION ALL

我有几个 table 想要比较数据和 return 来自 CDR 记录的最后通话日期。 table描述如下:

phone个数

包含 phone 个有服务的号码列表。

YYYY-MM

包含指定为 table 名称的期间的 CDR 记录。 YYYY = 4 位数年份,MM = 2 位数月份。

我目前的查询如下:

SELECT DISTINCT
customerid,
phonenumber,
(SELECT Started FROM (
(SELECT * FROM `2016-08` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-07` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-06` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-05` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-04` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-03` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-02` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-01` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
) AS p ORDER BY p.Started DESC LIMIT 1) `lastcall`
FROM phonenumbers WHERE phonenumbers.dateterminated IS NULL AND
(
    phonenumbers.phonenumber LIKE '800%' OR
    phonenumbers.phonenumber LIKE '855%' OR
    phonenumbers.phonenumber LIKE '866%' OR
    phonenumbers.phonenumber LIKE '877%' OR
    phonenumbers.phonenumber LIKE '888%'
)

以上查询逻辑是我希望实现的,作为来自我的 phone 号码 table 和最近的 Started(日期& 通话开始时间)其中 Caller 号码是在我的 phone 号码 table 中找到的免费电话号码,或者 Dialed 号码是在我的 phone 号码中找到的免费电话号码我的 phone 数字 table 前面加了一个“1”。

不幸的是,运行 这个查询给我以下错误:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS p ORDER BY p.Started DESC LIMIT 1) lastcall FROM phonenumbers WHERE phon' at line 13

我尝试过命名和不命名来自 UNION ALL 数据的结果集(在上面的示例中它被命名为 pAS p)。我没有命名的尝试如下:

SELECT DISTINCT
customerid,
phonenumber,
(SELECT Started FROM (
(SELECT * FROM `2016-08` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-07` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-06` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-05` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-04` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-03` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-02` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
(SELECT * FROM `2016-01` WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL
) ORDER BY Started DESC LIMIT 1) `lastcall`
FROM phonenumbers WHERE phonenumbers.dateterminated IS NULL AND
(
    phonenumbers.phonenumber LIKE '800%' OR
    phonenumbers.phonenumber LIKE '855%' OR
    phonenumbers.phonenumber LIKE '866%' OR
    phonenumbers.phonenumber LIKE '877%' OR
    phonenumbers.phonenumber LIKE '888%'
)

.. 导致此消息:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY Started DESC LIMIT 1) lastcall FROM phonenumbers WHERE phonenumber' at line 13

同样的错误,略有不同的上下文让我相信(像往常一样)错误在其他地方,但消息不清楚而且太笼统,无法解读 MySQL 抱怨的内容

如果查询中指定的所有字段和 table 都存在,并且我在上面恰当地描述了上下文,那么如何调整此查询以发挥作用?

从上一个联合中删除 "UNION ALL"。即在 (SELECT * FROM 2016-01 WHERE Dialed = CONCAT('1', phonenumbers.phonenumber) OR Caller = phonenumbers.phonenumber) UNION ALL.