【发布时间】:2018-05-01 07:06:54
【问题描述】:
我有一个下表结构。
USERS
PROPERTY_VALUE
PROPERTY_NAME
USER_PROPERTY_MAP
我正在尝试从users 表中检索在property_value 表中具有匹配属性的用户。
一个用户可以拥有多个属性。这里的示例数据有 2 个用户 '1' 的属性,但可能不止 2 个。我想在 WHERE 子句中使用所有这些用户属性。
如果用户只有一个属性,但对于超过 1 个属性它会失败,则此查询有效:
SELECT * FROM users u
INNER JOIN user_property_map upm ON u.id = upm.user_id
INNER JOIN property_value pv ON upm.property_value_id = pv.id
INNER JOIN property_name pn ON pv.property_name_id = pn.id
WHERE (pn.id = 1 AND pv.id IN (SELECT id FROM property_value WHERE value like '101')
AND pn.id = 2 AND pv.id IN (SELECT id FROM property_value WHERE value like '102')) and u.user_name = 'user1' and u.city = 'city1'
我明白,因为查询有 pn.id = 1 AND pn.id = 2 它总是会失败,因为 pn.id 可以是 1 或 2,但不能同时是两者。那么如何重写它以使其适用于 n 个属性?
在上面的示例数据中,只有一个具有id = 1 的用户具有WHERE 子句中使用的两个匹配属性。查询应返回包含 USERS 表的所有列的单个记录。
澄清我的要求
我正在开发一个应用程序,该应用程序在 UI 上有一个用户列表页面,列出了系统中的所有用户。此列表包含用户 ID、用户名、城市等信息 - USERS 表中的所有列。用户可以拥有上面数据库模型中详述的属性。
用户列表页面还提供基于这些属性搜索用户的功能。搜索具有 2 个属性“property1”和“property2”的用户时,页面应仅获取并显示匹配的行。根据上面的测试数据,只有用户 '1' 符合要求。
拥有 4 个属性包括“property1”和“property2”的用户符合条件。但是,由于缺少“property2”,只有一个属性“property1”的用户将被排除在外。
【问题讨论】:
-
OR 而不是 AND?
-
OR 为同一用户返回 2 个结果,分别针对 'property1' 和 'property2'。由于这两个属性都属于同一个用户,我想获得一条记录作为回报
-
需要
OR、group by和having count(*)=2 -
@Mike 尝试使用 'OR, group by 并且 count(*)=2' 但没有帮助。在我的情况下,我必须在 group by 中添加 6 列,但它总是返回空结果。
-
请将数据发布为文本,切勿以图片形式发布。并且您应该提供表定义(
CREATE TABLE语句)。
标签: sql postgresql relational-division