【发布时间】:2016-11-30 02:20:40
【问题描述】:
我正在使用 MySQL 并且有 3 个这样的表:
Create Table users (
firstName VARCHAR,
lastName VARCHAR,
userName VARCHAR,
email VARCHAR,
created DATETIME, etc.
Create Table data_2013 (
uid VARCHAR,
d1 INT,
d2 INT,
d3 INT, etc
Create Table data_2016 (
uid VARCHAR,
d1 INT,
d2 INT,
d3 INT, etc
两个数据表中的
uid匹配users表中的userName字段每个用户都出现在
users表中两次(或更多),但总是与匹配的firstName和lastName。这些用户的一个子集(大约 100 个)在两个“data_xxxx”表中都有数据。
对于 2013 年的数据,
userName是一个 8 个字符的字符串。对于 2016 年的数据,userName是他们当前的电子邮件地址(不一定与 2013 年使用的相同)。
我可以通过这样的查询获取所有拥有 2016 年数据的用户:
SELECT firstName,lastName,userName
FROM users
WHERE created > '2016-01-01'
AND userName IN(SELECT uid FROM data_2016)`
但我现在想要的是一个查询,它可以通过userName 为我提供拥有 2013 年数据的用户列表。但是,正如我所说,userName(或uid)不匹配,但firstName 和lastName 值应该匹配。
我需要这样的东西,在伪代码中:
SELECT userName
FROM users
WHERE created < '2014-01-01'
and firstName,lastName IN (
SELECT firstName,lastName
FROM users
WHERE created > '2016-01-01'
AND userName IN(SELECT uid FROM data_2016))
我确定联合或加入是答案,但我想不通。
有什么建议吗?
谢谢
编辑
这是来自users 表的一些示例数据:
以上用户2013年数据示例:
+--------+---------------------+----+----+----+--- -+----+ | uid |创建 | d1 | d2 | d3 | d4 | d5 | +--------+---------------------+----+----+----+--- -+----+ | rwhite | 2013-08-05 13:24:24 | 38 | 31 | 7 | 22 | 46 | +--------+---------------------+----+----+----+--- -+----+以上用户2016年数据示例:
+--------------------+---------+----+- ---+----+----+----+ | uid |创建 | d1 | d2 | d3 | d4 | d5 | +--------------------+---------+----+- ---+----+----+----+ | rwhite@company.com | 2016-10-24 12:37:29 | 38 | 48 | 59 | 71 | 17 | +--------------------+---------+----+- ---+----+----+----+EDIT2
我忘记了我有第四张表,其中包含某些客户的额外数据:
Create Table users_custA (
userName VARCHAR,
id_num VARCHAR,
etc.
)
以及该表中同一用户的示例:
+--------------------+-----------+
| userName | id_num |
+--------------------+-----------+
| rwhite | N00123450 |
| rwhite@company.com | N00123450 |
+--------------------+-----------+
这个id_num 保证对于给定的人是唯一的(即,R White 是一个人,在users_custA 表中有两个条目)。
问题还是一样:如何构造一个查询来生成在两个 data_xxxx 表中都有数据的用户名列表?
【问题讨论】:
-
您的 data_* 表是否有 firstName 和 lastName 字段?
-
向我们展示一些样本会更有帮助。
-
data_* 表只有这些字段:uid,d1..dN,created
-
添加了一些示例数据
标签: mysql select union where-in