gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:50:32 26 4
gpt4 key购买 nike

我有几个查询,我觉得可以在 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 子句。首先,请注意,如果没有 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

关于python - 使用单个查询从多个表中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com