检索列值相同的行

时间:2017-11-28 17:15:05

标签: python sqlalchemy

SQL-Alchemy合作,我想实施一些我遇到问题的特定功能。首先,这里有一些背景。

我有一个类似于以下内容的Review表:

id user item    review_score
1  Bob  Bicycle 1
2  Jane Apple   5
3  Dan  Table   4
4  John Car     2
5  Bob  Table   4
.. ...  ...     ...

现在,让我们按如下方式表达用户及其审核的项目:

     Bicycle Apple Table Car
Bob  1       N/A   4     N/A  
Jane N/A     5     N/A   N/A
Dan  N/A     N/A   4     N/A  
John N/A     N/A   N/A   2  

然后我可以通过relationship()Review表生成哪些项目进行了审核,以及每个人的得分,反之亦然users及其items使用sql-alchemy示例:

class User(UserMixin, Base):
    __tablename__ = 'users'
    userid = Column(Integer, primary_key=True)
    reviews = relationship('Review', backref='user')

这非常适合允许通过简单的成员访问权限对每位用户进行即时查看:user.reviews

以下是Review模型的样子:

class Review(Base):
     __tablename__ = 'reviews'
     reviewid = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
     userid = Column(Integer, ForeignKey('users.userid'), nullable=False)
     itemid = Column(Integer, ForeignKey('items.itemid'), nullable=False)
     review_score = Column(Integer, nullable=False)

现在,我正在迭代嵌套循环中的每个项目,以查看哪些用户同时评定了items_i& items_j当前的实现,我不满意;但是工作):

for item_i in Item.query.all():
    users_i = {review.userid : review.review_score for review in item_i.reviews}
    for item_j in Item.query.all():
        users_j = {review.userid: review.review_score for review in item_j.reviews}

        # There must be a better way to get the users that reviewed both via the SQL-Alchemy query() API.
        users_that_rated_both_items = users_i.keys() & users_j.keys()
        if users_that_rated_both_movies:
            # I need these two vectors below for future computations.
            reviews_i = [review.review_score for review in item_i.reviews if review.userid in users_that_rated_both_movies]
            reviews_j = [review.review_score for review in item_j.reviews if review.userid in users_that_rated_both_movies]

           # I do more computations here...

我基本上需要为每个用户和item_iitem_j建立一对评论对。

查看我尝试做的事情的一种非常简单的方法如下:

获取两个共享相同用户的商品的评论(因此评论的长度与他们共享相同的用户完全相同):len(item_i.reviews) == len(item_j.reviews)

有没有办法以更惯用的方式使用SQL-Alchemy提取这些数据?与我当前的方式相反,这涉及到userid'使用python' s set内置。

感谢。

0 个答案:

没有答案