带AND和OR的MySQL复杂查询

时间:2014-02-20 07:45:05

标签: mysql sql

似乎我正在尝试一次学习所有内容:PHP,JS,以及现在的MySQL查询,因此需要花费很长时间才能获得一个好的...我有一个测试数据库,如下所示。我希望用户在给定的日期范围内查看所有测试(包括预测试和后测试)。这是我尝试过的(并且失败了):

$query = $pdo->prepare("SELECT * 
FROM `starprepost` 
WHERE (`pretestdate` >= ? AND `pretestdate` <= ?)
OR (`posttestdate` >= ? AND `posttestdate <=?)
AND `site` = '". $_POST['fromlocation'] ."'
ORDER BY `pretestdate`, `posttestdate` ASC");
$query->execute(array($datebeginning, $dateending, $datebeginning, $dateending));

这是架构。此外,对任何有关如何构建良好查询的引用表示赞赏。

CREATE TABLE `starprepost` (
  `firstname` text,
  `lastname` text,
  `studentnumber` text,
  `site` text,
  `pretestdate` date DEFAULT NULL,
  `posttestdate` date DEFAULT NULL,
  `q1` text,
  `q2` text,
  `q3` text,
  `q4` text,
  `q5` text,
  `q6` text,
  `q7` text,
`id` int(6) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=latin1

1 个答案:

答案 0 :(得分:1)

尝试

$query = $pdo->prepare("SELECT * 
FROM `starprepost`  
WHERE ((`pretestdate` >= ? AND `pretestdate` <= ?) OR `pretestdate`= NULL )
AND ((`posttestdate` >= ? AND `posttestdate` <=?) OR `posttestdate` = NULL  )
AND `site` = '". $_POST['fromlocation'] ."'
ORDER BY `pretestdate`, `posttestdate` ASC");
$query->execute(array($datebeginning, $dateending, $datebeginning, $dateending));