Python 使用单个查询从多个表中提取

Python 使用单个查询从多个表中提取,python,mysql,sql,python-2.7,Python,Mysql,Sql,Python 2.7,我有几个查询,我觉得可以在mySQL中进行重构和简化,但我不知道如何进行。我是按程序做的,但我相信我能加快速度 基本上,从用户那里获取一个id,查看数据库,获取可能具有与给定参数类似的标记的行的id。确保排除原始参数,并且不包括任何重复的ID 有没有一种方法可以在纯sql中实现这一点 以下是我当前的代码: def getRelatedEvents(self, memberId, eventId): relatated_events = [] # first we get all

我有几个查询,我觉得可以在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]

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

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子句。首先,请注意,如果没有ORDERBY子句,这不会产生可预测的结果。下面是一个基于MySQL 8中可用的窗口函数行号的解决方案,它将为每个匹配的标记生成不超过3个事件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

好的,我试试这些。非常感谢您的回复。如果没有别的,它给了我一个开始的地方。