【问题标题】:SQL Using WHERE to get data from multiple tablesSQL 使用 WHERE 从多个表中获取数据
【发布时间】:2018-06-25 00:13:40
【问题描述】:

问题: 构造 SQL 语句以查找 Michael Phelps 发送的所有消息。注意:您必须使用 WHERE 子句来设置此查询的条件。显示以下列: - 发件人的名字 - 发件人的姓氏 - 收件人的名字 - 收货人的姓氏 - 消息 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)

我的解决方案: 选择 sender_id、receiver_id、message_id、message、send_datetime FROM 消息传递.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 |
+-----------+-------------+------------+--------------------------------------------+---------------------+

我这样做对吗?如何显示发送者和接收者的名字和姓氏?还是我的做法正确?

【问题讨论】:

  • 你必须加入表。搜索 SQL 内连接以获取信息

标签: sql mysqli


【解决方案1】:

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

Results

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

【讨论】:

    【解决方案2】:

    你可以使用连接来获取人名或任何你想要的。这里是查询

    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)的描述,而不是使用 messageId 上的内部连接来连接两个表。我希望结果表能给你所有你想要的细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多