Можно ли создать запрос с участием строк из двух таблиц, как это? - PullRequest
1 голос
/ 27 апреля 2019

Я хотел бы создать запрос, в котором он выбирает строку из таблицы, основываясь на нескольких условиях, которые я могу выполнить довольно хорошо.Однако я хотел бы выяснить, как отображать строки из таблицы, только если идентификатор этой записи не появлялся в другой таблице за последние 24 часа.Как бы я сделал что-то вроде этого, представь.Представьте, что таблица выглядит так:

ID .          | EMAIL .         | . PASS
------------- | --------------- | ---------------
1 .             abc@abc.com .     rgjoegeijerioge
2 .             ab46c@abc.com .   dgnkjrkjhrnjkrt
3 .             ab46c@abc.com .   etjhrnkrjkjhjhr

------------- | --------------- | --------------- | ---------------
transferID .    ACCOUNT .         ACCOUNTTO .       ITEM
------------- | --------------- | --------------- | ---------------
1 .             abc@abc.com .     rjek@xs.com .     book1
2 .             ab4gtrc@abc.com . xbjk@abc.com      book2
3 .             ab46gggc@abc.com  bca@lo.com        book2

, поэтому я хотел бы получить все строки из первой таблицы, в которой электронная почта / пользователь (или даже userID, если я изменяю структуру таблицы) не была частьюстрока, добавленная во вторую таблицу за последние 24 часа.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2019

Вы можете использовать NOT EXISTS

 SELECT * 
   FROM table1 t1 
  WHERE NOT EXISTS ( SELECT 0 
                       FROM table2 t2
                      WHERE t2.account = t1.email 
                        AND t2.insertion_date >= DATE_ADD(NOW(), INTERVAL -1 DAY)
                      )

при условии, что у вас есть столбец с именем insertion_date в table2

1 голос
/ 28 апреля 2019

Альтернативный метод JOIN, как упоминал Химаншу:

Таблица

drop table if exists userinfo;
create table userinfo (
    id int,
    email varchar(200),
    pass varchar(200)
);
insert into userinfo values
(1, 'abc@abc.com', ''),
(2, '123@abc.com', ''),
(3, 'xyz@abc.com', '');

drop table if exists transfers;
create table transfers (
    transferid int,
    account varchar(200),
    accountto varchar(200),
    item varchar(200),
    created_date datetime
);

insert into transfers values
(1, 'abc@abc.com', 't@abc.com', 'Book1', date_sub(now(), interval 1 hour)),
(2, '123@abc.com', 't@abc.com', 'Book2', date_sub(now(), interval 40 hour)),
(3, 'xyz@abc.com', 't@abc.com', 'Book3', date_sub(now(), interval 20 hour));

Запрос

select u.id, u.email
from userinfo u
left join transfers t
    on u.email = t.account
    and t.created_date >= date_sub(now(), interval 24 hour)
where t.transferid is not null;

Результат

id email
1  abc@abc.com
2  xyz@abc.com

Пример: https://rextester.com/UYM78253

0 голосов
/ 28 апреля 2019

Вам нужно иметь временную метку во второй таблице

    select * from table1
    where id not in (
                     Select id from table2 
                     where date >= now() - INTERVAL 1 DAY
                     )
0 голосов
/ 28 апреля 2019

Вы можете использовать LEFT JOIN, предполагая, что первая таблица table_1, а вторая table_2,

--We only want to check the `id` against `transferid` (simplest situation):
SELECT
    table_1.*
FROM
    table_1 
    LEFT JOIN table_2 ON table_1.ID = table_2.TransferID
WHERE
    table_2.TransferID IS NULL

Вторая ситуация,

--We want to check `email` against `account` and `accountto`:

SELECT
    table_1.*
FROM
    table_1 
    LEFT JOIN table_2 
        ON table_1.Email = table_2.Account OR table_1.Email = table_2.AccountTo
WHERE
    table_2.TransferID IS NULL

Вот дд скрипка:

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=5acd6dadbe6cb95f5399026f8ea3e052

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...