【发布时间】:2021-06-21 06:21:14
【问题描述】:
我有一个具有以下表格布局的 Postgres 数据库:
假设内容如下:
cars properties
| id | name | desc | | id | name | type |
------------------------------ ----------------------------
| 1 | 'Toyota' | 'Japanese'| | 1 | 'length' | 'dim' |
------------------------------ ----------------------------
| 2 | 'Ford' | 'American'| | 2 | 'vin' | 'reg' |
------------------------------ ----------------------------
float_properties string_properties
| car_id | property_id | min | max | | car_id | property_id | value |
---------------------------------------- ----------------------------------
| 1 | 1 | 10.5 | 12.5 | | 1 | 2 | 'abc' |
---------------------------------------- ----------------------------------
| 2 | 1 | 9.5 | 14 | | 2 | 2 | 'def' |
---------------------------------------- ----------------------------------
如何编写查询以从浮点和字符串属性表中获取给定值的汽车名称:
例如:给出'length' min > 10, max
我试过了
SELECT
C.name,
C.description,
P.name,
P.type
FROM
properties P
INNER JOIN float_properties FP
ON FP.property_id = P.id
INNER JOIN string_properties SP
ON SP.property_id = P.id
INNER JOIN cars C
ON C.id = FP.car_id AND C.id = SP.car_id
WHERE
P.name = 'length' AND FP.min > 10 AND FP.max < 13
AND
P.name = 'vin' AND SP.value = 'abc';
但这会返回零行。这里的正确查询是什么?
编辑:阅读@ginkul 的评论后,我想到了 2 个用例——我最初的问题是针对下面的用例 1:
-
从两个表中找出必须满足条件的汽车:例如:
条件 1:具有名为“length”的属性的汽车及其限制 min > 10 AND FP.max
条件 2:汽车具有名为“vin”且值为“abc”的属性
-
找到只需要满足其中一个条件的汽车;换句话说,所有具有 10
【问题讨论】:
-
现在你的条件是矛盾的,
P.name = 'length' ... AND P.name = 'vin'。我想他们之间应该是OR,是错字吗? -
@ginkul 现在想想,有2个用例,我会相应地更新问题。
标签: sql postgresql