Juntando 2 tabelas que têm a mesma chave estrangeira da mesma tabela, mas um é um para muitos

James :

Quero ver a atividade de um determinado membro em meu hotel. Quero ver quais quartos de hotel eles visitaram. No entanto, se eles visitaram os mesmos quartos de hotel, desejo apenas a visita mais recente desse quarto de hotel

customers
+--------+-------+-----------+
| cus_id | name  | driver_id |
+--------+-------+-----------+
|      1 | bob   |     11111 |
|      2 | james |     22222 |
|      3 | sam   |     33333 |
|      4 | billy |     44444 |
+--------+-------+-----------+


hotel_rooms (cus_id is the owner of the room)
+----------+------------+--------+
| hroom_id |    name    | cus_id |
+----------+------------+--------+
|        1 | small room |      3 |
|        2 | big room   |      1 |
+----------+------------+--------+

snapshots (when we detected the user in the room)
+-------------+----------+---------------------+
| snapshot_id | hroom_id |     date_added      |
+-------------+----------+---------------------+
|           1 |        1 | 2020-01-12 12:43:13 |
|           2 |        1 | 2020-01-13 17:23:53 |
|           3 |        2 | 2020-01-19 07:34:01 |
+-------------+----------+---------------------+

participants (who was also present in the same room at the particular time we detected the customer in the room)
+----------------+-------------+--------+
| participant_id | snapshot_id | cus_id |
+----------------+-------------+--------+
|              1 |           1 |      1 |
|              2 |           1 |      3 |
|              3 |           2 |      1 |
|              4 |           2 |      2 |
|              5 |           2 |      3 |
|              6 |           3 |      1 |
|              7 |           3 |      4 |
+----------------+-------------+--------+

Essencialmente, o que a tabela de participantes diz é:

  • snapshot_id=1 bobe samonde small room.
  • snapshot_id=2, bob, jamesE samonde em small room.
  • snapshot_id=3, bobe billyonde big room.

O resultado desejado para pesquisar a bobatividade de:

+-------------+------------+-----------------+---------------------+-------------------------+
| snapshot_id |    name    | owner_driver_id |     date_added      | participants_driver_ids |
+-------------+------------+-----------------+---------------------+-------------------------+
|           2 | small room |           33333 | 2020-01-13 17:23:53 | 11111,22222,33333       |
|           3 | big room   |           11111 | 2020-01-19 07:34:01 | 11111,44444             |
+-------------+------------+-----------------+---------------------+-------------------------+

Não consigo descobrir como combinar o driver_idpara o proprietário e os participantes

SELECT s.snapshot_id, hr.name, c.driver_id as owner_driver_id, MAX(s.date_added) as date_added, GROUP_CONCAT(p.driver_id) as participants_driver_ids
FROM hotel_rooms hr INNER JOIN
snapshots s
ON hr.hroom_id = s.hroom_id JOIN
participants p
ON s.snapshot_id = p.snapshot_id JOIN
customers c
ON hr.cus_id = c.cus_id
WHERE p.cus_id = 1
GROUP BY hr.cus_id
ORDER BY date_added
Usuario :

Você pode obter o resultado desejado encontrando primeiro a data máxima de instantâneo para cada sala que bobestava e, em seguida, juntando-a à tabela de instantâneos para obter o último instantâneo de cada sala. Em seguida, você precisa entrar em customersduas vezes, uma para o nome do proprietário da sala e uma vez para obter os nomes de cada um dos participantes:

SELECT s.snapshot_id, 
       hr.name, 
       c1.driver_id AS owner_driver_id,
       md.max_date AS date_added,
       GROUP_CONCAT(c2.driver_id) AS participants_driver_ids 
FROM snapshots s
JOIN (
  SELECT hr.hroom_id, MAX(date_added) AS max_date
  FROM hotel_rooms hr
  JOIN snapshots s ON s.hroom_id = hr.hroom_id
  JOIN participants p ON p.snapshot_id = s.snapshot_id
  JOIN customers c ON c.cus_id = p.cus_id
  WHERE c.name = 'bob'
  GROUP BY hr.hroom_id, hr.name
) md ON md.hroom_id = s.hroom_id AND md.max_date = s.date_added
JOIN hotel_rooms hr ON hr.hroom_id = s.hroom_id
JOIN customers c1 ON c1.cus_id = hr.cus_id
JOIN participants p ON p.snapshot_id = s.snapshot_id
JOIN customers c2 ON c2.cus_id = p.cus_id
GROUP BY s.snapshot_id, hr.name, c1.driver_id, md.max_date
ORDER BY md.max_date DESC
LIMIT 15

Resultado:

snapshot_id     name        owner_driver_id     date_added              participants_driver_ids
2               small room  33333               2020-01-13 17:23:53     11111,33333,22222
3               big room    11111               2020-01-19 07:34:01     44444,11111

Demonstração em SQLFiddle

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Chave estrangeira múltipla da mesma tabela

Juntando dicionários da mesma chave em um dataframe no pandas

tabelas de junção à esquerda que têm a mesma chave estrangeira: a análise da chave hash leva 50%

Como consultar valores únicos ou distintos juntando 3 tabelas que têm um para muitos relacionamentos

Chave estrangeira MYSQL para a mesma tabela?

Como garantir que o relacionamento de muitos para muitos tenha a mesma chave estrangeira

Relacionamentos com a mesma chave estrangeira para a mesma tabela Laravel 5

Flask + SQLalchemy relacionamento um para muitos dentro da mesma tabela não está funcionando

3 tabelas diferentes têm a mesma chave estrangeira, como selecionar

SQL - Cópia de linhas da mesma tabela, mas com ID de chave estrangeira diferente

Riscos com chave estrangeira que faz referência à chave primária da mesma tabela

Relacionamento um-para-muitos no Entity Framework: por que o valor da chave estrangeira é nulo?

Relacionamento um-para-muitos no Entity Framework: por que o valor da chave estrangeira é nulo?

Como mapear uma relação dupla Muitos para um à mesma tabela na Doutrina 2?

Juntando duas subconsultas que foram criadas a partir da mesma tabela

Como faço para carregar antecipadamente várias linhas de chave estrangeira da mesma tabela, no Sequelize?

Erro geral 1215 ao tentar fazer uma chave estrangeira dentro da mesma tabela, inteiro para inteiro

Como faço para carregar antecipadamente várias linhas de chave estrangeira da mesma tabela, no Sequelize?

Sequelizar tabela muitos para muitos com chave estrangeira idêntica é selecionar apenas um valor

Como obter um elemento raiz em uma tabela referenciando a si mesma com uma chave estrangeira? (ciclo ?)

Não é possível criar restrição de chave estrangeira no MySQL na criação da tabela, mas a sintaxe é a mesma que outras chaves estrangeiras

ON DELETE CASCADE para um relacionamento muitos para muitos com a mesma tabela no MS SQL Server

Impedir múltiplas referências de chave estrangeira para a mesma linha na tabela primária

Juntando duas tabelas no mysql - relacionamento um para muitos

Como mapear um usuário para outro (da mesma tabela)

INNER JOIN para duas colunas da mesma chave estrangeira

juntando três consultas da mesma tabela

Juntando-se à tabela INTO muitos para muitos (da tabela de chave primária)

EF Core - Como configurar muitos-para-muitos para a mesma entidade que já tem um relacionamento um-para-muitos