我有以下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”语句中都有两个人。
我的问题是:如何更改该语句以计算重复记录?
答案 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)
...但是如果我有这样的查询,我将重新设计表。