MySQL / PHP-在SELECT语句的WHERE部分中计算多个变量

时间:2018-07-25 15:14:42

标签: php mysql

我有以下PHP / MySQL语句:

$varTemp = mysqli_num_rows(mysqli_query($connect,"SELECT * FROM table WHERE
(Date1 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade1 > 224) OR
(Date2 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade2 > 224) OR
(Date3 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade3 > 224) OR
(Date4 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade4 > 224)"));

现在,语句之间有一个OR。我也尝试过UNION+,但一直得到相同的结果。该语句应该返回20条记录,但它只给我18条记录,因为“ Date1”和“ Date2”语句中都有两个人。

我的问题是:如何更改该语句以计算重复记录?

3 个答案:

答案 0 :(得分:0)

OR的性质表明,无论WHERE子句中匹配了多少部分,一条记录仅被计数一次。如果要对多个范围内的记录进行重复计数,则使用UNION可以使您走上正确的轨道。但是,UNION默认会删除重复项,从而为您提供与OR相同的结果。在您的情况下,您可能要使用UNION ALL,它与UNION相同,但是不会删除重复项。

答案 1 :(得分:0)

您的逻辑上有缺陷,为了获得所需的结果,您需要执行多个查询,在WHERE子句中使用OR只是说,如果发生这种情况,请将该结果放入结果中,以其作为过滤条件因此,它不会更改表本身的记录数。

您将需要执行以下操作:

SELECT * FROM table WHERE SELECT * FROM table WHERE
    (Date1 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade1 > 224)
UNION ALL
SELECT * FROM table WHERE SELECT * FROM table WHERE
    (Date2 BETWEEN '2017-10-01' AND '2017-10-31' AND marker = 'Post' AND grade2 > 224)

,然后对每个“或”重复上述操作,即可以复制记录。

答案 2 :(得分:0)

请注意,您的查询在功能上与...相同。

SELECT * 
  FROM table 
 WHERE 
     ( Date1 BETWEEN '2017-10-01' AND '2017-10-31' 
    OR Date2 BETWEEN '2017-10-01' AND '2017-10-31' 
    OR Date3 BETWEEN '2017-10-01' AND '2017-10-31' 
    OR Date4 BETWEEN '2017-10-01' AND '2017-10-31'
     )         
   AND marker = 'Post' 
   AND 224 IN(grade1,grade2,grade3,grade4)

...但是如果我有这样的查询,我将重新设计表。