mysql左连接的行为与左连接不同

mysql左连接的行为与左连接不同,mysql,sql,Mysql,Sql,这是我的问题。我必须在同一个查询中得到一系列问题及其答案。如果答案超过30天,我希望得到一个空的答复,但我仍然希望得到以下问题: 我想做一个左连接,但如果没有匹配的问题仍然没有出现。您可以在这个sqlfiddle和下面的地方看到模式和我的选择: 模式 CREATE TABLE `preguntas` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `id_formulario` INT(11) NOT NULL, `pregunta` TEXT NULL COLL

这是我的问题。我必须在同一个查询中得到一系列问题及其答案。如果答案超过30天,我希望得到一个空的答复,但我仍然希望得到以下问题:

我想做一个左连接,但如果没有匹配的问题仍然没有出现。您可以在这个sqlfiddle和下面的地方看到模式和我的选择:

模式

CREATE TABLE `preguntas` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`id_formulario` INT(11) NOT NULL,
`pregunta` TEXT NULL COLLATE 'utf8_spanish_ci',
`opcional` TINYINT(1) NOT NULL DEFAULT '0',
`activo` TINYINT(1) NOT NULL DEFAULT '0',
`orden` INT(11) NOT NULL,
PRIMARY KEY (`id`))

COLLATE='utf8_spanish_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=302
;

CREATE TABLE `respuestas` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`intento` INT(11) NOT NULL DEFAULT '1',
`id_formulario` INT(11) NOT NULL,
`id_pregunta` INT(11) NULL DEFAULT NULL,
`uuid_user` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
`nota` INT(11) NULL DEFAULT NULL,
`replied` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`))

COLLATE='utf8_spanish_ci'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=1259;

INSERT INTO `preguntas` (`id`, `id_formulario`, `pregunta`, `opcional`, `activo`, `orden`) VALUES (126, 1, 'INICIATIVA PERSONAL', 0, 1, 1);
INSERT INTO `preguntas` (`id`, `id_formulario`, `pregunta`, `opcional`, `activo`, `orden`) VALUES (139, 1, 'TENER RAPIDEZ Y AGILIDAD', 0, 1, 5);

INSERT INTO `respuestas` (`id`, `intento`, `id_formulario`, `id_pregunta`, `uuid_user`, `nota`, `replied`) VALUES (174, 1, 1, 126, 'f6912e4bb23130b9', 4, '2019-05-23 18:08:15');
INSERT INTO `respuestas` (`id`, `intento`, `id_formulario`, `id_pregunta`, `uuid_user`, `nota`, `replied`) VALUES (175, 1, 1, 139, 'f6912e4bb23130b9', 4, '2019-04-03 18:08:15');
当前结果:

id  id_formulario   pregunta    opcional    activo  orden   nota    replied
126 1   INICIATIVA PERSONAL false   true    1   4   2019-05-23T18:08:15Z
预期结果:

id  id_formulario   pregunta    opcional    activo  orden   nota    replied
126 1   INICIATIVA PERSONAL false   true    1   4   2019-05-23T18:08:15Z
139 1   TENER RAPIDEZ Y AGILIDAD    false   true    5   (empty) (empty)

没有得到所需结果的原因是WHERE子句。 在ON条款中加入条件:

SELECT p.*, r.nota, r.replied FROM preguntas p 
LEFT JOIN respuestas r 
ON p.id = r.id_pregunta AND r.uuid_user ="f6912e4bb23130b9" 
AND r.replied > DATE_SUB(NOW(),INTERVAL 30 DAY) 
AND p.id_formulario = "1" AND activo ="1" 
ORDER BY orden ASC
这种情况:

r.replied > DATE_SUB(NOW(),INTERVAL 30 DAY)
将该行放置在WHERE子句中时,将其从结果中删除,这就是您看不到该行的原因。通过将条件放在join的ON子句中,它仍然存在,尽管在另一个表中没有匹配项。 对于其他2种情况:

p.id_formulario = "1" AND activo ="1"

我不确定是否希望它们减少结果,所以请将它们保留在WHERE中。

将左表的列放入WHERE子句可以有效地将左联接转换为内部联接

要防止出现这种情况,请将条件移动到联接:

SELECT p.*, r.nota, r.replied FROM preguntas p 
LEFT JOIN respuestas r ON p.id = r.id_pregunta 
    AND r.uuid_user ="f6912e4bb23130b9" and r.replied > DATE_SUB(NOW(),INTERVAL 30 DAY) 
where p.id_formulario = "1" AND activo ="1" ORDER BY orden ASC
SELECT p.*, r.nota, r.replied FROM preguntas p 
LEFT JOIN respuestas r ON p.id = r.id_pregunta 
    AND r.uuid_user ="f6912e4bb23130b9" and r.replied > DATE_SUB(NOW(),INTERVAL 30 DAY) 
where p.id_formulario = "1" AND activo ="1" ORDER BY orden ASC