我有一个 Postgresql 11 数据库。假设我有一张桌子,叫做houses。它应该有数十万条记录。
CREATE TABLE houses (
pkid serial primary key,
address varchar(255) NOT NULL,
rent float NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
现在,我的房子有我想在数据库中注册的功能。由于可能的功能列表会很长(几十个)并且会随着时间的推移而演变,因为我不想在表屋中添加一长串列并使用“ALTER TABLE”不断更改表,我想到了这些功能有一个单独的表格:
CREATE TABLE house_features (
pkid serial primary key,
house_pkid integer NOT NULL,
feature_name varchar(255) NOT NULL,
feature_value varchar(255)
);
CREATE INDEX ON house_features (feature_name, feature_value);
ALTER TABLE house_features ADD CONSTRAINT features_fk FOREIGN KEY (house_pkid) REFERENCES houses (pkid) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
平均而言,每个房屋记录在house_features表中将有 10-20 条记录。
到目前为止,这似乎是一个简单高效的模型:我可以添加尽可能多的不同功能,控制上层(应用层和/或 GUI)中feature_name和feature_value的可能值。每次应用程序发展时我都不必更改数据库,我需要一种新的功能。 …
我有以下数据:
机构_编号 | 信用类型 |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
我有一个列表框,以便用户可以选择多个 Cred_type,他们希望能够选择 OR 或 AND 条件。
对于 OR 我有这样的 AND CRED_TYPE IN (1,2)
对于AND,我真是摸不着头脑。他们的意思是,他们想要一份具有cred type 1和cred_type 2的机构列表。也许我没有想清楚,但这是逐行的,所以这样做会导致没有结果。
AND cred_type = 1 AND cred_type = 2 -- 您不能让一行有两个不同的值,这将不会返回任何结果。
它们要求用户可以选择 10、20 或更多,因此为每个代码编写一堆代码并将它们组合起来非常困难 - 但这是我迄今为止唯一的想法。会是这样的
Select institution_no from table where cred_type = 1
UNION
Select institution_no from table where cred_type = 2
Run Code Online (Sandbox Code Playgroud)
-- 这会将两者结合起来并得到我想要的东西,但你可以想象其中 10 或 20 个的所有代码。
我在stackoverlow上问过同样的问题,但没有得到答案,所以这就是我在这里问的原因(我读过应该在 SO 上问简单的 sql 问题,但我别无选择)。
假设我有 3 个表:posts
,post_categories
和categories
. 我正在实现某种带有过滤器的页面,我可以在其中按类别过滤帖子。用户可以选择多个类别。当他选择多个时,它们应该相加。我无法让它工作。我现在拥有的是简单的IN()
SQL 子句:
SELECT posts.id, post_categories.category_id FROM posts
JOIN post_categories ON posts.id = post_categories.post_id
WHERE post_categories.category_id IN (1,2,3) LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
但它并不匹配所有的 id,它是OR
,我需要AND
. 我在这里需要的是查找类别为 的所有帖子id=1 AND id=2 AND id=3
,但此查询返回IN()
列表中至少有一个类别的帖子。
证明或反驳:
鉴于此
T=R÷S
,暗示S=R÷T
.
我的尝试:
让我们拿一些R,S
表格来划分R÷S
:
第1步:
R S ==> T=R÷S
------------- --------- -----
| A | B | C | | A | B | | C |
| 1 | 2 | 4 | | 1 | 2 | | 4 |
| 3 | 3 | 4 | | 3 | 3 | | 9 |
| 1 | 7 | 4 |
| 1 | 2 | 9 |
| …
Run Code Online (Sandbox Code Playgroud)