【问题标题】:msyql compare values of two fields in subquerymysql比较子查询中两个字段的值
【发布时间】: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 表中两次(或更多),但总是与匹配的firstNamelastName

  • 这些用户的一个子集(大约 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)不匹配,但firstNamelastName 值应该匹配。

我需要这样的东西,在伪代码中:

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 表的一些示例数据:

+------------+------------+----------+- ------------------------------------+----------+ |用户名 |名字 |姓氏 |电子邮件 |创建 | +------------+------------+----------+- ------------------------------------+----------+ | rwhite |罗伯特 |白色 | xxxxxxxxxx@gmail.com | 2013-08-05 13:13:23 | | rwhite@company.com |罗伯特 |白色 | rwhite@company.com | 2016-10-23 20:26:52 | +------------+------------+----------+- ------------------------------------+----------+

以上用户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


【解决方案1】:

通常,期望名称在时间上是唯一且一致的有点不可靠,但如果您确定数据中的情况是这样,那么您可以像这样调整您的查询(假设您有 case-不敏感的排序规则):

SELECT userName 
FROM users As u2013
WHERE created >= '2013-01-01' 
AND created < '2014-01-01'
AND EXISTS (
    SELECT 1 
    FROM users As u2016
    WHERE created >= '2016-01-01' 
    AND created < '2017-01-01'
    AND u2016.FirstName = u2013.FirstName
    AND u2016.LastName = u2013.LastName
    AND EXISTS (SELECT 1 FROM data_2016 WHERE data_2016.uid = u2016.userName));

您将使用WHERE EXISTS 而不是WHERE ... IN,因为 不支持WHERE (col1, col2) IN ...,它只支持单个列or so I understand.

编辑

您可以通过这种方式整合您的users_custA 表以获得更确定的匹配:

Select *
  From users_custA 
  Where id_num In (
    SELECT id_num
      FROM (
        SELECT DISTINCT id_num 
          FROM users As u
          JOIN users_custA As a On u.userName = a.userName
          WHERE created >= '2013-01-01' 
          AND created < '2014-01-01'
        UNION ALL
        SELECT DISTINCT id_num
          FROM users As u
          JOIN users_custA As a On u.userName = a.userName
          WHERE created >= '2016-01-01'
          AND created < '2017-01-01') As union_subquery
      GROUP BY id_num
      HAVING COUNT(*) = 2);

【讨论】:

  • 感谢您的回复。会试一试。不过,在我这样做之前,我必须提一下——我忘记了我有第四张表,它对每个用户都有一个唯一的 ID。将在另一个编辑中解释更多。我同意依赖名字是不好的。
  • @atreyu 在您的问题中,您说users_custA 表有“一些 客户的额外数据”。如果其中没有所有个客户,那么我认为这对回答您的查询没有帮助。
  • 好点。幸运的是,我可以保证,虽然users_custA 表没有为users 表中的每个用户提供额外数据,但它确实为data_xxxx 表中的每个用户提供了额外数据,这对我来说很重要, 对于这个查询。
  • @atreyu 我添加了一个替代版本,可以使用你提到的新表。
猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多