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.'))