我在MySQL中为一家Electron 商务网站提供了以下表格(Offer_Properties):

+----------+-------------+---------+
| offer_id | pkey        | pvalue  |
+----------+-------------+---------+
|       63 | shoesize    | shoe_47 |
|       63 | sport       | walking |
|       63 | color       | multi   |
|       12 | color       | multi   |
|       12 | shoesize    | size_48 |
|       12 | shoesize    | size_47 |
|       12 | shoesize    | size_46 |
|       12 | sneakertype | comfort |
|       12 | sport       | running |
+----------+-------------+---------+

找到优惠的最简单方法是什么?

shoesize = size_48 AND sport = running

我可以在

select offer_id from offer_properties where (pkey = "sport" and pvalue = "running") and offer_id IN (select offer_id from offer_properties where (pkey = "shoesize" and pvalue = "size_48"));

然而,这种递归方法真的很困难,因为可能会有各种属性匹配请求.此外,我还有其他表需要连接,查询很快就会变得很复杂.我有一个表保存值(价格、描述等),另一个规范化表保存优惠标签.

I LEFT JOIN来查找将某些标签与某些属性和某些值相匹配的报价.然而,事情很快就变得非常复杂.

对于这种情况,你会有什么指导意见?我是否应该使用带有promise 的简单查询,并使用应用程序逻辑一步一步地过滤事物?

非常感谢

推荐答案

您可以使用conditional aggregation来避免自联接.


select offer_id
from (
  select offer_id, 
    sum(case when pkey = 'shoesize' and pvalue = 'size_48' then 1 else 0 end) cond1, 
    sum(case when pkey = 'sport' and pvalue = 'running' then 1 else 0 end) cond2
  from offer_properties
  group by offer_id
  )z
where cond1> 0 and cond2> 0;
offer_id
12

View on DB Fiddle

Mysql相关问答推荐

在MySQL中存储一条帖子的点赞数量

数组上的MySQL、JSON_CONTAINS用法

递归查询意外地为一个字段返回空值

在MySQL查询中查找和替换表内的值

在两个日期之间生成每个月的1行数据.

为什么我的 SQL 查询不更新 Node.js 和 MySQL 中用户以外的用户属性?

拆分列值并适当地返回拆分值

java.lang.NullPointerException:无法调用com.proj.my.repository.OrderRepository.save(Object),因为this.orderRepository为空

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

如何在更新语句中使用多个子字符串函数?

在 SQL 中 for each 组返回具有最大值的行,包括具有相同值的行

使用 DISTINCT 时无法从数据库中查询所有数据

基于 2 列的重复行的 SQL 查询

Mysql 相等性反对 false 或 true

如何在 Windows 上访问 xampp 的命令行

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

MySQL - 在 MySQL UPDATE 或 SELECT 查询中使用 If Then Else

我可以在 PHP 中使用 PDO 创建数据库吗?

在 MySQL 中的子查询上使用 GROUP_CONCAT

mysql GROUP_CONCAT 重复