如何编写MySQL查询,根据两行数据获取目标order_id
解决EAV表中查询同时满足多属性条件的order_id问题
你的原查询无法返回结果,是因为单条记录不可能同时拥有两个不同的data_key值——data_key不能既是date又是product_id,所以AND连接的条件永远无法匹配到任何行。
针对这种EAV(实体-属性-值)结构的表,要找到同时满足多个属性条件的order_id,可以用以下几种方法:
方法1:GROUP BY + HAVING 统计匹配项
先筛选出满足任一条件的记录,再通过分组统计确保该order_id同时满足所有条件:
SELECT order_id FROM order_data WHERE (data_key = 'date' AND data_value = '2023-05-15') OR (data_key = 'product_id' AND data_value = '123') GROUP BY order_id HAVING COUNT(DISTINCT data_key) = 2;
这里COUNT(DISTINCT data_key) = 2确保该订单同时存在date和product_id两种匹配记录。
方法2:自连接匹配多条件
将表与自身连接,分别匹配不同的属性条件:
SELECT a.order_id FROM order_data a JOIN order_data b ON a.order_id = b.order_id WHERE a.data_key = 'date' AND a.data_value = '2023-05-15' AND b.data_key = 'product_id' AND b.data_value = '123';
这种方式通过关联同一张表的两个实例,分别获取满足不同条件的记录,最终得到同时符合两个条件的order_id。
方法3:子查询筛选交集
先获取满足第一个条件的order_id集合,再从中筛选出满足第二个条件的结果:
SELECT order_id FROM order_data WHERE data_key = 'product_id' AND data_value = '123' AND order_id IN ( SELECT order_id FROM order_data WHERE data_key = 'date' AND data_value = '2023-05-15' );
这种写法逻辑直观,适合条件较少的场景。
内容的提问来源于stack exchange,提问作者bigdaveygeorge
相关产品推荐
相关产品推荐

