mysql - 查询内连接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');
非常感谢您的帮助
解决方案
我想你想要left join
s:
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
,即使其他表中没有匹配的行。
请注意,我还添加了表别名,因此查询更易于编写和阅读。
推荐阅读
- c++ - 使用 wincrypt 将主题备用名称添加到自签名证书
- open-policy-agent - 如何检查rego中是否定义了值?
- python - 在python中赋值之前引用的局部变量'mes'?
- javascript - 逗号分隔的域列表的正则表达式
- c - C、数据结构
- python - 以编程方式将图片导入 Apple Photos 并修改 Exif 数据
- c# - 不支持字符串表示的 DateTime 且 String 未被识别为有效的 DateTime
- cordova - 如何启用 Cordova 应用程序以收听语音“Ok Cordova”以激活语音识别
- python - 使用numpy,生成从-n到n的数组的最快方法是什么,不包括0,是“n”一个整数?
- python - 在 tkinter 的类中的函数之间传递变量:self.param vs param