Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

128
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda