SQL Использование WHERE для получения данных из нескольких таблиц - PullRequest
0 голосов
/ 25 июня 2018

Проблема: Создайте оператор SQL, чтобы найти все сообщения, отправленные Майклом Фелпсом. Примечание: вы должны использовать ГДЕ предложение, чтобы установить условия для этого запроса. Показать следующие столбцы: - Имя отправителя - Фамилия отправителя - Имя получателя - Фамилия получателя - ID сообщения - сообщение - отметка времени сообщения

Таблицы:

SELECT * FROM contact_list;
+---------------+-----------+------------+----------+
| connection_id | person_id | contact_id | favorite |
+---------------+-----------+------------+----------+
|             1 |         1 |          2 | n        |
|             2 |         1 |          3 | n        |
|             3 |         1 |          4 | n        |
|             4 |         1 |          5 | n        |
|             5 |         1 |          6 | n        |
|             6 |         2 |          1 | y        |
|             7 |         2 |          3 | n        |
|             8 |         2 |          4 | n        |
|             9 |         3 |          1 | y        |
|            10 |         3 |          4 | n        |
|            11 |         4 |          5 | n        |
|            12 |         4 |          6 | n        |
|            13 |         5 |          1 | y        |
|            14 |         5 |          6 | n        |
|            15 |         7 |          1 | y        |
|            16 |         7 |          2 | n        |
|            17 |         7 |          4 | n        |
+---------------+-----------+------------+----------+
17 rows in set (0.00 sec)

SELECT * FROM person;
+-----------+------------+-----------+------------+
| person_id | first_name | last_name | person_age |
+-----------+------------+-----------+------------+
|         1 | Michael    | Phelps    |            |
|         2 | Katie      | Ledecky   |            |
|         3 | Usain      | Bolt      |            |
|         4 | Allyson    | Felix     |            |
|         5 | Kevin      | Durant    |            |
|         7 | Tom        | Soyer     | 25         |
+-----------+------------+-----------+------------+
6 rows in set (0.00 sec)

SELECT * FROM message;
+------------+-----------+-------------+--------------------------------------------+---------------------+
| message_id | sender_id | receiver_id | message                                    | send_datetime       |
+------------+-----------+-------------+--------------------------------------------+---------------------+
|          1 |         1 |           2 | Congrats on winning the 800m Freestyle!    | 2016-12-25 09:00:00 |
|          2 |         2 |           1 | Congrats on winning 23 gold medals!        | 2016-12-25 09:01:00 |
|          3 |         3 |           1 | You're the greatest swimmer ever           | 2016-12-25 09:02:00 |
|          4 |         1 |           3 | Thanks!  You're the greatest sprinter ever | 2016-12-25 09:04:00 |
|          5 |         1 |           4 | Good luck on your race                     | 2016-12-25 09:05:00 |
+------------+-----------+-------------+--------------------------------------------+---------------------+
5 rows in set (0.00 sec)

Мое решение: SELECT sender_id, receive_id, message_id, message, send_datetime FROM messaging.message ГДЕ sender_id = 1;

+-----------+-------------+------------+--------------------------------------------+---------------------+
| sender_id | receiver_id | message_id | message                                    | send_datetime       |
+-----------+-------------+------------+--------------------------------------------+---------------------+
|         1 |           2 |          1 | Congrats on winning the 800m Freestyle!    | 2016-12-25 09:00:00 |
|         1 |           3 |          4 | Thanks!  You're the greatest sprinter ever | 2016-12-25 09:04:00 |
|         1 |           4 |          5 | Good luck on your race                     | 2016-12-25 09:05:00 |
+-----------+-------------+------------+--------------------------------------------+---------------------+

Я правильно делаю? Как мне показать отправителей и получателей имя и фамилию? Или я так делаю правильно?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

SQL Fiddle

Настройка схемы MySQL 5.6 :

create table contact_list(
    connection_id int,
    person_id int,
    contact_id int,
    favorite varchar(1)
);

insert into contact_list values (1, 1, 2, 'n');
insert into contact_list values (2, 1, 3, 'n');
insert into contact_list values (3, 1, 4, 'n');
insert into contact_list values (4, 1, 5, 'n');
insert into contact_list values (5, 1, 6, 'n');
insert into contact_list values (6, 2, 1, 'y');
insert into contact_list values (7, 2, 3, 'n');
insert into contact_list values (8, 2, 4, 'n');
insert into contact_list values (9, 3, 1, 'y');
insert into contact_list values (0, 3, 4, 'n');
insert into contact_list values (1, 4, 5, 'n');
insert into contact_list values (2, 4, 6, 'n');
insert into contact_list values (3, 5, 1, 'y');
insert into contact_list values (4, 5, 6, 'n');
insert into contact_list values (5, 7, 1, 'y');
insert into contact_list values (6, 7, 2, 'n');
insert into contact_list values (7, 7, 4, 'n');


create table person (
    person_id int,
    first_name varchar(200),
    last_name varchar(200),
    person_age int
);

insert into person values (1, 'Michael', 'Phelps', null);
insert into person values (2, 'Katie', 'Ledecky', null);
insert into person values (3, 'Usain', 'Bolt', null);
insert into person values (4, 'Allyson', 'Felix', null);
insert into person values (5, 'Kevin', 'Durant', null);
insert into person values (7, 'Tom', 'Soyer', 25);


create table message (
    message_id int,
    sender_id int,
    receiver_id int,
    message varchar(200),
    send_datetime DATETIME
);

insert into message values (1, 1, 2, 'Congrats on winning the 800m Freestyle!', '2016-12-25 09:00:00');
insert into message values (2, 2, 1, 'Congrats on winning 23 gold medals!', '2016-12-25 09:01:00');
insert into message values (3, 3, 1, 'You\'re the greatest swimmer ever', '2016-12-25 09:02:00');
insert into message values (4, 1, 3, 'Thanks!  You\'re the greatest sprinter ever', '2016-12-25 09:04:00');
insert into message values (5, 1, 4, 'Good luck on your race', '2016-12-25 09:05:00');

Что нужно сделать, чтобы получить эти поля :

select 
  pSender.first_name as 'Sender\'s first name',
  pSender.last_name as 'Sender\'s last name',
  pReciever.first_name as 'Receiver\'s first name',
  pReciever.last_name as 'Receiver\'s last name',
  m.message_id as 'Message ID',
  m.message as 'Message',
  m.send_datetime as 'Message Timestamp'
from
  message m
  join person pSender on pSender.person_id = m.sender_id
  join person pReciever on pReciever.person_id = m.receiver_id

Результаты

| Sender's first name | Sender's last name | Receiver's first name | Receiver's last name | Message ID |                                    Message |    Message Timestamp |
|---------------------|--------------------|-----------------------|----------------------|------------|--------------------------------------------|----------------------|
|               Katie |            Ledecky |               Michael |               Phelps |          2 |        Congrats on winning 23 gold medals! | 2016-12-25T09:01:00Z |
|               Usain |               Bolt |               Michael |               Phelps |          3 |           You're the greatest swimmer ever | 2016-12-25T09:02:00Z |
|             Michael |             Phelps |                 Katie |              Ledecky |          1 |    Congrats on winning the 800m Freestyle! | 2016-12-25T09:00:00Z |
|             Michael |             Phelps |                 Usain |                 Bolt |          4 | Thanks!  You're the greatest sprinter ever | 2016-12-25T09:04:00Z |
|             Michael |             Phelps |               Allyson |                Felix |          5 |                     Good luck on your race | 2016-12-25T09:05:00Z |
0 голосов
/ 25 июня 2018

вы можете использовать объединения, чтобы получить имя человека или что угодно. Вот запрос

select * from 
( select m.messageid,m.senderId,p.first_name as 'senderName' from message m inner join person p on ( p.person_id=m.senderId) 
) sen
inner join 
( select m.messageid,m.receiver_id,p.first_name as 'receiverName' from message m 
inner join person p on (  p.person_id=m.receiver_id)
) rec
on (rec.messageid=sen.messageid)
where sen.senderId=1

вот описание. Я создаю две временные таблицы (то есть sen для отправителя и rec для получателя), чем joinобе таблицы используют внутреннее соединение для messageId.Я надеюсь, что таблица результатов даст вам все детали, которые вы хотите.

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