首页 > 解决方案 > 查询内连接3张表

问题描述

我正在做这个查询:

 SELECT DISTINCT a.codAsistencia
               , a.fecha
               , a.mensaje
               , u.nombre
               , u.id
               , u.telefono
               , c.tiempoRestanteBono
            FROM asistencia a
            JOIN users u
              ON a.usuario = u.id
            JOIN contratan c
              ON c.usuario = u.id
           WHERE a.codAsistencia = 2

当 codAsistencia = x 时,我需要获取所有这些数据

phpmyadmin 返回了一个不完整的结果,我不太清楚如何使用内部连接进行查询...我附上一张图片供您展示

我必须告诉我我的表格中有一个数据,在 contratan、users 和 asistencia 中......我不知道我做错了

我在 asistencia 的数据是:

CREATE TABLE `asistencia` (
  `codAsistencia` int(10) UNSIGNED NOT NULL,
  `fecha` datetime NOT NULL,
  `mensaje` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `usuario` bigint(20) UNSIGNED NOT NULL,
  `estado` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pendiente',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `asistencia`
--

INSERT INTO `asistencia` (`codAsistencia`, `fecha`, `mensaje`, `usuario`, `estado`, `created_at`, `updated_at`) VALUES
(2, '2020-11-11 11:27:09', 'prueba', 2, 'pendiente', NULL, NULL);

逆向

CREATE TABLE `contratan` (
    `codContrato` int(10) UNSIGNED NOT NULL,
      `bono` int(10) UNSIGNED NOT NULL,
      `tiempoRestanteBono` int(10) UNSIGNED NOT NULL,
      `activo` tinyint(4) NOT NULL DEFAULT 0,
      `usuario` bigint(20) UNSIGNED NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    --
    -- Volcado de datos para la tabla `contratan`
    --
    
    INSERT INTO `contratan` (`codContrato`, `bono`, `tiempoRestanteBono`, `activo`, `usuario`) VALUES
    (20, 1, 30, 1, 7);

在用户中

    CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `nif` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `nombre` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email_verified_at` timestamp NULL DEFAULT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `direccion` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `perfil` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'usuario',
  `telefono` int(11) DEFAULT NULL,
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Volcado de datos para la tabla `users`
--

INSERT INTO `users` (`id`, `nif`, `nombre`, `email`, `email_verified_at`, `password`, `direccion`, `perfil`, `telefono`, `remember_token`, `created_at`, `updated_at`) VALUES
(2, '123456', 'David Serrano Alonso', 'daviserraalonso@hotmail.com', NULL, '$2y$10$/BfMjo1J8W.UFtQAGTUX9O0Ae9RilA5JFipu0ZVnLWrwDSIQ65NBS', NULL, 'tecnico', NULL, NULL, '2020-11-08 10:59:29', '2020-11-08 10:59:29'),
(3, '45921676z', 'David Serrano Alonso', 'daviserraalonso@pepemail.com', NULL, '$2y$10$wLEOohpZrxbAcFcKC07x5u5gNeA/zeJZwUWNLoec5FsrUfQ5P.9Nu', NULL, 'usuario', 652138927, NULL, '2020-11-11 07:56:12', '2020-11-11 07:56:12'),
(7, '45921676z', 'David Serrano Alonso', 'daviserraalonso@gmail.com', '2020-11-11 08:21:19', '$2y$10$wT2YvsBlypLD.FjADnP0s.vk2liOq/tFM.vHeCGXO3jyGiBReyzsm', NULL, 'usuario', 652138927, NULL, '2020-11-11 08:20:46', '2020-11-11 08:21:19');

在此处输入图像描述

非常感谢您的帮助

标签: mysqlsql

解决方案


你想要left joins:

SELECT distinct a.codAsistencia, a.fecha, a.mensaje,
       u.nombre, u.id, u.telefono, ct.tiempoRestanteBono
FROM asistencia a LEFT JOIN
     users u
     ON a.usuario = u.id LEFT JOIN
     contratan ct
     ON ct.usuario = u.id
WHERE a.codAsistencia = 2;

这将保留所有匹配的行asistencia,即使其他表中没有匹配的行。

请注意,我还添加了表别名,因此查询更易于编写和阅读。


推荐阅读