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

标签 php mysql sql activerecord

我有一个查询,我想根据另一个表中所选项目的 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/

相关文章:

sql - Rails 中的原始数据库查询

php - 在 PHP 和 MySQL 中显示来自 URL 的图像

php - 如何使用 php 获取 NAT 后面的 ip?

php - Redis 通过 laravel 扫描家族命令?

mysql - 为什么我共同的好友查询这么慢?

mysql - SQL 查询 - 派生一个查询,该查询将找到其他查询获得的数字的平均值

sql - 在 SQL 中使用触发器的非空约束

php - 使用 SimpleXML 对 XML 的 SOAP 响应

database - SQL语句的限制

PHP/MySQL 在排序时,SELECT 结果中的某些行对特定列具有不同的值