简体   繁体   English

MySQL 同表查询不同列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM