[英]MySQL Query On The Same Table Different Columns
I have two tables: Project and ProjectFieldValue我有两个表:Project 和 ProjectFieldValue
I am needing to return results from the ProjectFieldValue based on multiple different key/value options in the table.我需要根据表中多个不同的键/值选项从 ProjectFieldValue 返回结果。 I can get it to work with one key/value pair, but once I add another AND statement to the query it returns nothing.我可以让它与一个键/值对一起工作,但是一旦我将另一个 AND 语句添加到查询中,它什么也不返回。
Here is a sample of my tables followed by my query...这是我的表格示例,后面是我的查询......
Project Table项目表
----------------------
id | name
----------------------
1 | Project #1
ProjectFieldValue Table项目字段值表
I have millions of records like this and they are all stored in this table and associated to a specific Project.我有数百万条这样的记录,它们都存储在此表中并与特定项目相关联。
----------------------------------------------------------------------------------------
id | project_id | text_value | date_value | field_key
----------------------------------------------------------------------------------------
1 | 1 | Active | NULL | contract_status
2 | 1 | NULL | 2020-06-02 00:01:58 | listing_date
3 | 1 | Seller | NULL | contract_client_type
4 | 1 | Active | NULL | contract_option
Here are my queries broken down by what works and doesn't work:以下是我的查询,按有效和无效分类:
This does work, but, it is searching on 1 key/value pair...这确实有效,但是,它正在搜索 1 个键/值对...
SELECT p.name, p.id
FROM ProjectFieldValue pfv
LEFT JOIN Project p
ON pfv.project_id = p.id
WHERE (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Active')) AND field_key = 'contract_status')
GROUP BY p.id
This doesn't work because it is searching on 3 key/value pairs...这不起作用,因为它正在搜索 3 个键/值对...
SELECT p.name, p.id
FROM ProjectFieldValue pfv
LEFT JOIN Project p
ON pfv.project_id = p.id
WHERE (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Active')) AND field_key = 'contract_status')
AND (pfv.text_value IN ( SELECT text_value FROM ProjectFieldValue WHERE text_value IN ('Seller')) AND field_key = 'contract_client_type')
AND (pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59' AND pfv.field_key = 'listing_date')
GROUP BY p.id
Goal目标
Ultimately, what I would need to be able to do is search on unlimited key/value pairs in this table and return all results grouped by the p.id最终,我需要能够在此表中搜索无限的键/值对并返回按 p.id 分组的所有结果
Thanks for your help!谢谢你的帮助!
This should do the thing.这应该做的事情。
SELECT p.name, p.id
FROM ProjectFieldValue pfv
LEFT JOIN Project p
ON pfv.project_id = p.id
WHERE (field_key = 'contract_status' AND pfv.text_value = 'Active')
OR (field_key = 'contract_client_type' AND pfv.text_value = 'Seller')
OR (pfv.field_key = 'listing_date' AND pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59')
GROUP BY p.id;
But I have doubt why you are Left joining Project and ProjectFieldValue.但我怀疑你为什么要离开 Project 和 ProjectFieldValue。 A simple Inner Join should solve your purpose.一个简单的内部连接应该可以解决您的目的。 As you are grouping by on p.id.当您按 p.id 分组时。 You may encourage a lot of NULLed columns.您可能会鼓励使用大量 NULL 列。 So I would suggest below.所以我建议如下。
SELECT p.name, p.id
FROM Project p
JOIN ProjectFieldValue pfv
ON p.id = pfv.project_id
WHERE (field_key = 'contract_status' AND pfv.text_value = 'Active')
OR (field_key = 'contract_client_type' AND pfv.text_value = 'Seller')
OR (pfv.field_key = 'listing_date' AND pfv.date_value between '2020-07-08 00:00:00' AND '2020-07-11 23:59:59')
GROUP BY p.id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.