【问题标题】:Use a single query to pull from mulitple tables使用单个查询从多个表中提取
【发布时间】:2019-02-22 19:00:22
【问题描述】:

我有几个查询,我觉得可以在 mySQL 中重构并更轻松地完成,但我不知道如何去做。我正在以编程方式执行此操作,但我确信我可以加快速度。

基本上从用户那里获取一个 id,查看数据库并获取可能与给定参数具有相似标签的行的 id。确保排除原始参数并且不包括任何重复的 ID。

有没有办法在纯 sql 中做到这一点?

这是我当前的代码:

def getRelatedEvents(self, memberId, eventId):
    relatated_events = []

    # first we get all the tags related to this event
    for tag in self.db.query("select tagName from event_tags where eventId={}".format(eventId)):
        # we iterate through each tag and find the eventIds for it
        events = self.db.query("SELECT eventId from event_tags where tagName LIKE %s and eventId != %s LIMIT 3",
                               '%'+tag['tagName']+'%', eventId)

    # we group them in a list, excluding ones that are already in here
        for id in events:
            if id['eventId'] not in relatated_events:
                relatated_events.append(id['eventId'])

    # we get the extra event info for each item in the related list and return
    return [self.getSpecificEvent(memberId, item) for item in relatated_events]

【问题讨论】:

    标签: python mysql sql python-2.7


    【解决方案1】:

    您应该能够通过自联接来实现这一点,例如:

    SELECT DISTINCT e2.eventId
    FROM event_tags e1
    INNER JOIN event_tags e2 
        ON e2.tagName LIKE CONCAT('%', e1.tagName, '%') AND e2.eventId != e1.eventId
    WHERE e1.eventId = {}
    

    我注意到第二个查询有一个LIMIT 3 子句。首先,请注意,如果没有ORDER BY 子句,这不会产生可预测的结果。这是一个基于窗口函数ROW_NUMBER()(在 MySQL 8 中可用)的解决方案,它会为每个匹配的标签生成不超过 3 个event_id

    SELECT DISTINCT event_id FROM (
        SELECT e2.eventId, ROW_NUMBER() OVER(PARTITION BY e1.eventId ORDER BY e2.eventId) rn
        FROM event_tags e1
        INNER JOIN event_tags e2 
            ON e2.tagName LIKE CONCAT('%', e1.tagName, '%') AND e2.eventId != e1.eventId
        WHERE e1.eventId = {}
    ) WHERE rn <= 3
    

    【讨论】:

    • 好的,我会试试这些。非常感谢您的回复。如果没有别的,它给了我一个开始的地方。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2015-02-16
    • 2022-10-04
    • 2015-06-18
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多