Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

165
Visualizações
Faltan filas debido a una declaración WHERE demasiado estricta

En el código de ejemplo a continuación, hemos intentado minimizar nuestro problema en un caso de prueba simplificado.

Tenemos 3 tablas: usuarios, imágenes y valoraciones.

1: Queremos imprimir todas las entradas de la tabla de 'calificaciones'.

2: En la tabla de 'imágenes', puede haber varias imágenes cargadas por los mismos usuarios en diferentes secciones del sitio, por ejemplo, 'imagen_perfil_usuario' o 'foto_portada_usuario'.

3: Al imprimir las calificaciones, queremos obtener entradas de la tabla de 'imágenes' si el usuario ha subido una foto de perfil (sección = 'imagen_de_perfil').

La declaración WHERE en la consulta en el código de ejemplo falla para los usuarios que no cargan imágenes de perfil.

¿Cómo podemos asegurarnos de imprimir todas las entradas, así como solo capturar la imagen conectada al usuario si la sección = imagen_perfil …?

 CREATE TABLE `test_ratings` ( `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` int(4) UNSIGNED NOT NULL, `rating` enum('1','2','3','4','5') DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `test_ratings` (`id`, `user_id`, `rating`) VALUES (2, 2, '4'), (1, 1, '5'); CREATE TABLE `test_users` ( `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `test_users` (`id`, `username`) VALUES (1, 'Test person 1'), (2, 'Test person 2'); CREATE TABLE `test_users_images` ( `id` int(4) UNSIGNED NOT NULL AUTO_INCREMENT, `filename` varchar(80) NOT NULL, `section` enum('user_cover_photo','user_profile_picture') DEFAULT NULL, `user_id` int(4) UNSIGNED DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `test_users_images` (`id`, `filename`, `section`, `user_id`) VALUES (1, 'rtfos.jpg', 'user_profile_picture', 2), (2, 'exer8.jpg', 'user_cover_photo', 2); <?php $mysqli = new mysqli("localhost", "root", "", "website"); $result = $mysqli->query('SELECT image.filename, user.username, ratings.rating FROM test_ratings ratings INNER JOIN test_users user ON user.id = ratings.user_id INNER JOIN test_users_images image ON image.user_id = user.id WHERE image.section = \'user_profile_picture\''); while ($row = $result->fetch_object()) { echo '<p>' . $row->username . ' - ' . $row->filename . '</p>'; } ?>
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Como ya se comentó, comience con la tabla de usuarios y únase a ella. Incluya el filtro de sección de imagen en la cláusula ON de la unión respectiva.

 SELECT image.filename, user.username, ratings.rating FROM test_users user LEFT JOIN test_users_images image ON image.user_id = user.id AND image.section = 'user_profile_picture' LEFT JOIN test_ratings ratings ON user.id = ratings.user_id;

db<>violín

PD: Es una cláusula WHERE , no una declaración.

over 4 years ago · Santiago Trujillo Relatório

0

Al cambiar INNER JOIN a LEFT JOIN para image.sections, mantiene todas las filas de las calificaciones (si el usuario aún existe en la base de datos). Para incluir usuarios sin una imagen de perfil, debe agregar una condición que permita que image.section sea NULL.

 SELECT image.filename, user.username, ratings.rating FROM test_ratings ratings INNER JOIN test_users user ON user.id = ratings.user_id LEFT JOIN test_users_images image ON image.user_id = user.id WHERE image.section = 'user_profile_picture' OR image.section IS NULL

db<>violín

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda