Mysql&;PHP搜索表,查找值介于两个日期和其他记录值之间的记录

Mysql&;PHP搜索表,查找值介于两个日期和其他记录值之间的记录,php,mysql,Php,Mysql,我有一张类似的桌子: ----------------------------------------------------------------------- id | project_id | dateValue | textValue | key ----------------------------------------------------------------------- 1 | 1 | 2018-10-25 | NULL

我有一张类似的桌子:

-----------------------------------------------------------------------
id  | project_id  | dateValue    | textValue     | key
-----------------------------------------------------------------------
1   | 1           | 2018-10-25   | NULL          | closing_date
-----------------------------------------------------------------------
2   | 2           | 2018-10-26   | NULL          | listing_date
-----------------------------------------------------------------------
3   | 3           | 2018-10-27   | NULL          | closing_date
-----------------------------------------------------------------------
4   | 1           | NULL         | Pending       | contract_status
-----------------------------------------------------------------------
5   | 2           | NULL         | Active        | contract_status
-----------------------------------------------------------------------
6   | 3           | NULL         | Pending acc.  | contract_status
-----------------------------------------------------------------------
我无法通过此返回任何结果。。有什么建议吗?我需要它来返回项目ID“1和3”

我也尝试过这种变化:

 SELECT     t.*
 FROM       Table t
 WHERE      ((t.dateValue BETWEEN '2018-10-24' AND '2018-10-27') AND        (t.key IN ('contract_status', 'closing_date') AND t.textValue IN ('Pending','Pending acc.'))
 GROUP BY   t.project_id

谢谢

因为您的数据集不能在一行中覆盖所有条件。您可以将条件聚合与
Having
子句一起使用:

SELECT t.project_id, 
       SUM(IF(t.dateValue BETWEEN '2018-10-24' 
                              AND '2018-10-27', 
              1, 0)) AS date_check, 
       SUM(IF(t.key = 'contract_status' AND 
              t.textValue IN ('Pending','Pending acc.'), 
              1, 0)) AS key_check   
FROM Table t
GROUP BY t.project_id 
HAVING date_check > 0 AND 
       key_check > 0  

您的DB模式很奇怪,目标不明确

以下是一些你可以用来理解为什么你没有得到任何结果的东西:

但您肯定应该重新设计数据库,并阅读更多有关关系数据库的信息

您的主要问题是
WHERE
子句

WHERE ((t.dateValue BETWEEN '2018-10-24' AND '2018-10-27') 
   AND (t.key = 'contract_status' 
   AND t.textValue IN ('Pending','Pending acc.'))

您可以在任何地方使用
,这意味着您希望找到所有具有例如
dateValue
textValue
的记录,但在原始数据中根本没有此类记录。:-)

你的标准不匹配。1-3没有钥匙,4-6没有日期。也许您的应用程序正在插入数据而不是更新记录?使用数据示例,两个查询都不会返回任何内容。再次检查您的条件。当您使用GROUP BY时,在SELECT子句上,您只能使用GROUP BY子句中显式声明的列,或对其余列使用聚合方法。只是一个提示。@LargeTuna请检查发布的答案,并告诉我它是否适合您。谢谢,尝试将其应用到我现有的代码库中……您只是在不需要的情况下增加了复杂性。@FelippeDuarte OP的数据集更像是一个日志条目。对于不同的活动,有不同的行,并且它们会不断单独更新。一个简单的Where条件是不够的,我将不得不重新思考我的模式,这个查询是一种很慢的方式,它会拖回结果-超过3秒。@LargeTuna是的,它会很慢,因为条件聚合。但基于您当前的模式,这似乎是正确的解决方案。它确实有效,谢谢!太慢了,因为我是如何构建模式的:(
SELECT     t.project_id,
MAX(t.dateValue),
MAX(t.textValue)
 FROM      t
 WHERE (t.dateValue BETWEEN '2018-10-24' AND '2018-10-27'
 AND   (t.key = 'closing_date'))
 OR t.textValue IN ('Pending','Pending acc.')
 GROUP BY   t.project_id
WHERE ((t.dateValue BETWEEN '2018-10-24' AND '2018-10-27') 
   AND (t.key = 'contract_status' 
   AND t.textValue IN ('Pending','Pending acc.'))