Muy bien, estoy trabajando en una tarea final y estoy muy atascado en esta única tarea. Intenté buscarlo y leer guías y no llegué a ninguna parte. Para empeorar las cosas, mi profesor no se ha molestado en enseñarnos cómo hacer este tipo de tarea en particular y no puedo molestarme en pedirle ayuda, ya que le toma días responder. La tarea es,

"Busque todos los mensajes enviados por Michael Phelps.

Construya la instrucción SQL para encontrar todos los mensajes que envió Michael Phelps.

Nota: debe utilizar la cláusula WHERE para establecer las condiciones de esta consulta ".

Mostrar las siguientes columnas:

  • Nombre del remitente
  • Apellido del remitente
  • Nombre del destinatario
  • Apellido del receptor
  • ID del mensaje
  • Mensaje
  • Marca de tiempo del mensaje

Tengo 5 tablas en mi base de datos (contact_list, image, message_image, person y message).

En general, esto sería bastante fácil, sin embargo, estoy atascado en cómo obtener los nombres del remitente y del destinatario. De alguna manera, tengo que hacer una referencia cruzada entre sender_id y receiver_id de la tabla de mensajes con person_id de la tabla de personas. Eso es en lo que estoy atrapado.

¿Cómo diablos puedo lograr esto? Sé cómo configurarlo para que dé los números de identificación, pero no tengo ni idea de cómo, supongo, convertirlo. ¿Entonces muestra sus nombres en su lugar? Consideré simplemente hacer otra tabla y luego consultar a partir de eso, pero estoy bastante seguro de que me marcarán para eso.

Cualquier ayuda sería muy apreciada.

Datos de la tabla de personas:

person_id| first_name| last_name|location

1|        Michael| Phelps| Maryland, USA

2|        Katie| Ledecky| Maryland, USA

3|        Usain| Bolt| Kingston, Jamaica

4|        Allyson| Felix| California, USA

5|        Kevin| Durant| New York City, USA

7|        Elijah| Steger| Oklahoma, USA

Datos de la tabla de mensajes:

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

Resultado esperado: la tabla sería demasiado grande para mostrarse, pero esencialmente necesito mostrar todos los mensajes que envió Michael Phelps y la tabla debe mostrar su nombre y apellido, el nombre y apellido del destinatario, la identificación del mensaje, el mensaje en sí, y la marca de tiempo de cuando se envió el mensaje.

Mi intento inicial fue en la línea de;

SELECT 
s.first_name AS "Sender's First Name",
s.last_name AS "Sender's Last Name",
r.first_name AS "Receiver's First Name",
r.last_name AS "Receiver's Last Name",
m.message_id AS "Message ID",
m.message AS "Message",
m.send_datetime AS "Message Timestamp",
FROM
person s,
person r,
message m,
WHERE
m.sender_id = 1 AND
s.person_id = m.sender_id AND
r.person_id = m.receiver_id;

Desafortunadamente, simplemente no funciona.

0
EliSteger 20 oct. 2019 a las 23:04

1 respuesta

La mejor respuesta

Espero que no hayas aprendido esta sintaxis de unión en clase. Las uniones separadas por comas se utilizaron en la década de 1980 y se hicieron redundantes en Standard SQL 1992.

Tu error es la coma aquí:

message m,

Y aquí:

m.send_datetime AS "Message Timestamp",

Así es como debe escribirse su consulta:

SELECT 
  s.first_name AS "Sender's First Name",
  s.last_name AS "Sender's Last Name",
  r.first_name AS "Receiver's First Name",
  r.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 s ON s.person_id = m.sender_id
JOIN person r ON r.person_id = m.receiver_id
WHERE m.sender_id = 1
ORDER BY m.send_datetime;
1
Thorsten Kettner 20 oct. 2019 a las 22:09