AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 286471
Accepted
ERJAN
ERJAN
Asked: 2021-03-05 19:17:43 +0800 CST2021-03-05 19:17:43 +0800 CST 2021-03-05 19:17:43 +0800 CST

por que devo juntar 2 mesas com 1 mesa separada

  • 772

Não consegui resolver esse problema no hackerrank e tive que procurar a solução. Eu estava entrando nas mesas erradas.

São 4 tabelas:

  • hackers
  • desafios
  • envios feitos por hackers e suas pontuações
  • tabela de dificuldade com níveis.

a descrição da tarefa:

Escreva uma consulta para imprimir o respectivo hacker_id e o nome dos hackers que alcançaram a pontuação máxima em mais de um desafio.

Campos da tabela de envios: submit_id, hacker_id, challenge_id, score

campos da tabela de desafios: challenge_id, hacker_id, dificuldade_level

A forma como entrei: hackers + desafios, desafios + dificuldade, desafios + envios.

select  
hackers.hacker_id, name
 
from submissions inner join challenges on submissions.challenge_id = challenges.challenge_id 
inner join difficulty on difficulty.difficulty_level = challenges.difficulty_level
inner join hackers on 

challenges.hacker_id = hackers.hacker_id -- here is wrong part!

where difficulty.score = submissions.score and difficulty.difficulty_level = challenges.difficulty_level
group by hackers.hacker_id, name 
having count( challenges.challenge_id)> 1
order by count( challenges.challenge_id) desc, hackers.hacker_id 

No entanto, o caminho certo era quase o mesmo - exceto que eu deveria ter participado de envios + hackers por hacker_id vs não envios + desafios por challenge_id.

A forma correta:

select  
hackers.hacker_id,name

from submissions inner join challenges on submissions.challenge_id = challenges.challenge_id 
inner join difficulty on difficulty.difficulty_level = challenges.difficulty_level
inner join hackers on submissions.hacker_id = hackers.hacker_id
where difficulty.score = submissions.score and difficulty.difficulty_level = challenges.difficulty_level
group by hackers.hacker_id, name 
having count( challenges.challenge_id)> 1
order by count( challenges.challenge_id) desc, hackers.hacker_id 

Qual é a lógica por trás da junção de envios + desafios por challenge_id vs envios + hackers por hacker_id?

por que produz resultado diferente? Um hacker faz envios, então não importa se eu entro no desafio+submissão+hackers ou submissão+hacker+desafio...

mysql join
  • 1 1 respostas
  • 77 Views

1 respostas

  • Voted
  1. Best Answer
    Caius Jard
    2021-03-05T21:56:33+08:002021-03-05T21:56:33+08:00

    É um palpite porque você não forneceu o link para o desafio (no markdown você tem que fazer links como, [this problem](http://whatever.com)mas clicar no link leva para http://this%20problem, então acho que o markdown está quebrado

    Você disse que tem tabelas:

    Hacker - I guess this is like a user table
    Challenge - I guess this is a problem to solve
    Submission - I guess it's an answer a hacker has made to a problem
    

    Assim, podemos claramente ter "um hacker pode responder a muitos desafios" e "um desafio tem muitos hackers respondendo", ou seja, muitos relacionamentos, então precisamos de uma tabela no meio para dividi-lo e rastrear qual hacker respondeu a qual desafio, e isso é a tabela de Envios fazendo essa divisão

    Esta parte interessante aqui, e possivelmente colocada deliberadamente para enganar as pessoas, é que o Challenge também tem uma coluna de ID de hacker. Por alguma razão, as tabelas de classificação de hackers rastreiam um relacionamento hacker-challenge que não tem nada a ver com um envio, ou seja, o ID do hacker na tabela de desafios é algo em que pode haver apenas um hacker para esse desafio, como o hacker que o criou ou o hacker que primeiro obteve a pontuação perfeita, ou o hacker que é responsável por marcar as respostas nele, ou o hacker que o pegou mais recentemente.

    Seja qual for o motivo, você disse que se juntou a esse ID de hacker, o que , na minha opinião, é a coisa errada a fazer , porque não tem relação com a questão de vários hackers que enviaram: pode ser que o hacker challenge.hacker_idno submissão ao desafio, eles simplesmente o escreveram e nunca o responderam. Portanto, não pode lhe dar as respostas que o desafio busca. Provavelmente é para pegar você e é uma das razões pelas quais, quando estou projetando um esquema de banco de dados, pretendo colocar o motivo de uma coluna em seu nome em casos como este; ou seja, na mesa do Desafio eu poderia ter chamado author_hackeridoumoderator_hackeridpara descrever não apenas para onde ele se vincula (tabela de hacker no ID do hacker), mas por que ele se vincula lá (autor, moderador, primeiro vencedor, tomador recente), especialmente se houver várias pessoas .. (embora nesse caso possa fazer mais sentido ter outra tabela, como submissão) que divide hacker e desafio e fornece uma razão pela qual esse hacker está relacionado a esse desafio)

    Lembre-se de que só porque duas colunas têm o mesmo nome, isso não significa que sejam opções alternativas de junção. Mesmo as colunas que participaram de uma junção antes não são alternativas, se for uma junção esquerda. Se for uma junção interna, jogo justo:

    a INNER JOIN b ON a.id = b.id INNER JOIN c ON b.id = c.id
    a INNER JOIN b ON a.id = b.id INNER JOIN c ON a.id = c.id
                                                  ^
    

    mas estes podem dar resultados diferentes:

    a LEFT JOIN b ON a.id = b.id LEFT JOIN c ON b.id = c.id
    a LEFT JOIN b ON a.id = b.id LEFT JOIN c ON a.id = c.id
    

    Essa pequena, mas crítica diferença na segunda consulta de ambas as tabelas deixadas para unir a pode ser enorme

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve