2016-11-30 6 views
0

Я использую MySQL и есть 3 таблицы, как так:msyql сравнения значений двух полей в подзапрос

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 в двух таблицах данных соответствует userName поле в users таблице

  • Каждый пользователь присутствует в таблице 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) не соответствует, однако значения .

мне нужно что-то вроде этого, в псевдокоде:

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)) 

Я уверен, что союз или присоединиться ответ, но я не могу понять это.

Любые советы?

Благодаря

EDIT

Вот некоторые примеры данных из users таблицы:

 

    +------------------------+-----------+----------+------------------------+---------------------+ 
    | userName    | firstName | lastName | email     | created    | 
    +------------------------+-----------+----------+------------------------+---------------------+ 
    | rwhite     | ROBERT | WHITE | [email protected] | 2013-08-05 13:13:23 | 
    | [email protected]  | Robert | White | [email protected]  | 2016-10-23 20:26:52 | 
    +------------------------+-----------+----------+------------------------+---------------------+ 

Пример выше данных пользователя 2013:

 

    +--------+---------------------+----+----+----+----+----+ 
    | uid | created    | d1 | d2 | d3 | d4 | d5 | 
    +--------+---------------------+----+----+----+----+----+ 
    | rwhite | 2013-08-05 13:24:24 | 38 | 31 | 7 | 22 | 46 | 
    +--------+---------------------+----+----+----+----+----+ 

Пример выше пользователей х 2016:

 

    +--------------------+---------------------+----+----+----+----+----+ 
    | uid    | created    | d1 | d2 | d3 | d4 | d5 | 
    +--------------------+---------------------+----+----+----+----+----+ 
    | [email protected] | 2016-10-24 12:37:29 | 38 | 48 | 59 | 71 | 17 | 
    +--------------------+---------------------+----+----+----+----+----+ 

EDIT2

Я забыл, что у меня был 4-й таблицу, которая имеет дополнительные данные для некоторых клиентов:

Create Table users_custA (
    userName VARCHAR, 
    id_num VARCHAR, 
    etc. 
) 

и пример того же пользователя в этой таблице:

+--------------------+-----------+ 
| userName   | id_num | 
+--------------------+-----------+ 
| rwhite    | N0| 
| [email protected] | N0| 
+--------------------+-----------+ 

Это id_num является guara чтобы быть уникальным для данного человека (т., R White - один человек с двумя записями в таблице users_custA).

Вопрос остается тем же: как я могу построить запрос, который генерирует список имен пользователей, имеющих данные в обеих таблицах data_xxxx?

+0

ли у вашего data_ * столов ПгвЬЫате и LastName поля? – Nerdwood

+0

Покажите нам, что какой-то образец станет более полезным. – Blank

+0

data_ * таблицы имеют только эти поля: uid, d1..dN, созданный – atreyu

ответ

0

Немного ненадежным, как правило, ожидать, что имена будут уникальными и согласованными во времени, но если вы уверены, что это так в ваших данных, тогда вы можете настроить свой запрос следующим образом (предположим, что у вас есть случай нечувствительными к регистру сортировки):

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.

EDIT

Вы можете интегрировать ваш 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); 
+0

Спасибо за ваш ответ. попробует. Прежде чем я это сделаю, я должен упомянуть - я забыл, что у меня 4-я таблица с уникальным идентификатором для каждого пользователя. объяснит больше в другом редактировании. Я согласен с тем, что полагаться на имена BAD. – atreyu

+0

@atreyu В вашем вопросе вы говорите, что таблица 'users_custA' имеет« дополнительные данные для * некоторых клиентов ». Если в нем нет * всех * клиентов, то я не думаю, что было бы полезно ответить на ваш запрос. – mendosi

+0

хороший пункт. к счастью, я могу гарантировать, что, хотя таблица 'users_custA' не содержит дополнительных данных для каждого пользователя в таблице' users', у нее есть дополнительные данные для каждого пользователя в таблицах 'data_xxxx', что для меня важно. , для этого запроса. – atreyu