SQL запрос выбора из двух таблиц - PullRequest
0 голосов
/ 12 марта 2020

У меня есть две таблицы в базе данных. В обоих случаях, столбец id является ключом.

TABLE 1: users

(int)      (String)
id  |       email     |
------------------------
0   |    one@mail.co  |
1   |    two@mail.co  |
2   |    three@mail.co|
3   |    four@mail.co |
------------------------

TABLE 2: users_availability

(int)      (TIME)            (TIME)
id  |     from_time  |      to_time
---------------------------------------
0   |      12:00     |      14:00     
1   |      11:15     |      15:00     
2   |      13:00     |      14:00     
3   |      11:30     |      14:30     
---------------------------------------

Что я хочу?

Мне нужен запрос, который с учетом электронной почты адрес в таблице users (например, 'one@mail.co') возвращает список идентификаторов тех пользователей, у которых значение from_time <= равно идентификатору, связанному с электронной почтой, и to_time> = чем то идентификатора, связанного с электронной почтой.

Пример:

С учетом адреса электронной почты 'one@mail.com' запрос должен вернуть идентификаторы 1 и 3.

Что я пробовал?

"SELECT user_avaiability.id
            FROM user_avaiability
            INNER JOIN users_availability 
            ON (users_availability.from_time >= (SELECT users.id
                                               FROM users WHERE email='one@gmail.com')
                                               /*lacking reference to from_time*/
            AND users_availability.to_time <= (SELECT users.id
                                               FROM users WHERE email='one@gmail.com'))";
                                               /*lacking reference to to_time*/

Информация базы данных:

Server: Localhost via UNIX socket
Server type: MariaDB
Server connection: SSL is not being used Documentation
Server version: 10.4.11-MariaDB - Source distribution
Protocol version: 10
User: root@localhost
Server charset: UTF-8 Unicode (utf8mb4)

1 Ответ

0 голосов
/ 12 марта 2020

Важно полностью понять, как эти две таблицы связаны друг с другом. Мы можем сделать вывод, что id в users_availability - это то же самое id из таблицы users, поэтому one@mail.co имеет доступность от 12:00 до 14:00.

Однако это не совсем понятно из схемы или описания.

При проектировании базы данных гораздо чаще встречается столбец id в user_availability, означающий поле автоинкрементного ключа, отличное от его собственной таблицы. Если он предназначен для использования в качестве внешнего ключа для таблицы users, его следует назвать более похожим на user_id.

Тем не менее, если мы примем вывод как точный, мы можем написать этот запрос:

SELECT ua2.id
FROM users u
INNER JOIN users_availability ua1 on ua1.id = u.id
INNER JOIN users_availability ua2 ON ua2.from_time <= ua1.from_time 
    and ua2.to_time >= ua1.to_time
WHERE u.email = @email
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...