0

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

4

1 回答 1

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列表。

于 2013-08-05T20:45:52.167 回答