【发布时间】:2019-05-14 05:16:06
【问题描述】:
我正在使用在线提供的 Yelp 数据集。几天来,我一直在尝试优化我的查询。对于我将在下面列出的架构,我需要构建一个查询以提供以下内容:
- 给定用户的 UID,显示用户每个朋友的最新评论信息。
这是架构:
CREATE TABLE business(
bid varchar(40) PRIMARY KEY,
name varchar(100),
city varchar(40),
state char(2),
zip varchar(10),
latitude real,
longitude real,
address varchar(100),
numreviews INTEGER DEFAULT 0,
numcheckins INTEGER DEFAULT 0,
avgreview float DEFAULT 0,
isopen bool,
stars float
);
CREATE TABLE users(
uid varchar(40) PRIMARY KEY,
name varchar(40),
avgstars float,
fans INTEGER,
coolvotes INTEGER,
reviewcount INTEGER,
funnyvotes INTEGER,
signup varchar(20),
usefulvotes INTEGER,
latitude real,
longitude real
);
CREATE TABLE reviews(
rid varchar(40) PRIMARY KEY,
bid varchar(40),
uid varchar(40),
stars float,
date varchar(20),
funny INTEGER,
useful INTEGER,
cool INTEGER,
text varchar(1024),
FOREIGN KEY (uid) REFERENCES users(uid),
FOREIGN KEY (bid) REFERENCES business(bid)
);
CREATE TABLE friends(
uid varchar(40) REFERENCES users(uid),
fid varchar(40) REFERENCES users(uid)
);
对于用户的每个朋友,我显示以下内容:
- 朋友的名字
- 最近评论中的商家名称
- 商家最近评价的城市
- 他们最近的评论中的文字
目前这是我唯一成功的“解决方案”。
第 1 步:获取用户每个朋友的所有 ID 列表。
SELECT fid from friends where uid = '{userId}'
这将返回用户每个朋友的所有用户 ID 的列表。所以我基本上有一个朋友ID列表。
第 2 步: 有了这些信息,我在我的程序中对该列表运行 foreach 循环。对于好友 ID 列表的每次迭代,我执行以下查询并为当前循环迭代提供临时好友 ID:
SELECT U.name, B.name, B.city, R.text, R.date FROM reviews as R, users as U, business as B
WHERE U.uid = '{currentFriendId}'
AND R.uid = '{currentFriendId}'
AND B.bid = R.bid
AND date = (SELECT MAX(date) FROM reviews WHERE uid = '{currentFriendId}')
每次我运行这个 for 循环时,我都会得到一行我想要的输出,例如:
这很棒...除了我必须为用户的每个朋友运行此查询。这是非常昂贵的。
目标:我正在尝试将这 2 个查询结合起来,或者完全修改它们,以便在一个查询中一次生成所有行。
问题:鉴于提供的信息,我如何修复我的查询以从单个查询生成所有这些信息?
【问题讨论】:
-
第二个查询不需要或不希望在
WHERE子句中使用E.uid = ???????表达式。 -
不清楚你在问什么。您使用什么语言?可以添加一些示例数据吗?
-
@TimBiegeleisen 我添加了实际代码,你能看一下吗?
-
@Nick 嗨尼克,我添加了我的实际代码,因为我认为我的示例太简单了。可以看看吗?
-
请阅读有关使用准备好的语句的信息。你当前的代码有很多问题。
标签: c# sql postgresql