gpt4 book ai didi

php - MySQL 辅助查询对性能要求太高

转载 作者:行者123 更新时间:2023-11-29 13:41:05 24 4
gpt4 key购买 nike

我有一个查询,我想根据另一个表中所选项目的 ID 从另一个表中提取 ID。我目前正在根据从主查询获得的结果使用附加查询来执行此操作。这导致了许多额外的查询。有没有办法将其压缩为 1 个查询?

SELECT music.id,
SUM(linked_tags.weight) AS total_weight
FROM (music)
INNER JOIN linked_tags ON linked_tags.track_id = music.id
AND linked_tags.tag_id IN (7,56,59)
GROUP BY music.id
ORDER BY total_weight DESC

然后,附加查询来自通过 foreach 循环运行主查询的结果,其中 2713 是音乐表中项目的 ID。

SELECT tag_id,
weight
FROM (linked_tags)
JOIN tags_en ON tags_en.id = linked_tags.tag_id
WHERE track_id = '2713'

这会产生此对象,其中 all_tags 是来自第二个查询的数据:

[id] => 1500
[name] => Some Track Name
[total_weight] => 10
[all_tags] => Array
(
[0] => 20
[1] => 28
[2] => 4
[3] => 13
[4] => 16
[5] => 7
[6] => 42
[7] => 56
[8] => 61
)

有没有办法将所有这些都放入 1 个查询中?

最佳答案

您可以使用join直接组合它们:

select tag_id, weight
from (SELECT music.id,
SUM(linked_tags.weight) AS total_weight
FROM music join
linked_tags
ON linked_tags.track_id = music.id AND linked_tags.tag_id IN (7,56,59)
GROUP BY music.id
) m join
linked_tags
on m.id = linked_tags.track_id join
tags_en
ON tags_en.id = linked_tags.tag_id;

编辑:

如果我正确理解查询,您正在尝试获取“轨道”(或“音乐”)上的所有标签,这些标签在(7,56,59)集合中具有一个或多个标签并且,您想要获得这三个标签的权重总和。

如果您不介意将标签放在逗号分隔的列表中,则可以一次性完成此操作:

 SELECT m.id,
SUM(case when lt.tag_id IN (7,56,59) then lt.weight end) AS total_weight,
sum(lt.tag_id IN (7, 56, 59)) as NumSpecialTags,
group_concat(lt.tag_id) as AllTags
FROM music m join
linked_tags lt
ON lt.track_id = m.id
GROUP BY m.id
having NumSpecialTags > 0
order by total_weight desc;

然后您必须在应用程序层解析 AllTags 列表。

关于php - MySQL 辅助查询对性能要求太高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18067228/

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