画像ごとに、3 つのタグのどれが最適かを選択します。次に、その中から最適なものを選択します。
MySQL で次のトリックを使用して、各イメージに最適なものを選択できます。
select i.id, max(score) as maxscore,
substring_index(group_concat(it.tag_id order by score desc, rand()), ',', 1) as prefTag
from image i join
acme_images_tags it
on i.id = it.image_id and
it.tag_id in (20, 21, 22)
group by i.id;
の複雑な式prefTag
は、各画像の最高得点のタグを選択します。はrand()
同点を処理するためにあり、同等のベスト スコアを持つすべてのタグが同等の確率を持つようにします。
次に、同じ考え方を使用して、各タグに最適な画像を選択できます。
select prefTag,
substring_index(group_concat(id order by maxscore desc), ',', 1) as image_id
from (select i.id, max(score) as maxscore,
substring_index(group_concat(it.tag_id order by score desc, rand()), ',', 1) as prefTag
from image i join
acme_images_tags it
on i.id = it.image_id and
it.tag_id in (20, 21, 22)
group by i.id
) t
group by prefTag
これは、 を使用した以前のソリューションよりも簡単です (ただし同等です) union all
。私はそれを以下に残しています。
(select i.id, max(score) as maxscore,
substring_index(group_concat(it.tag_id order by score desc), ',', 1) as prefTag
from image i join
acme_images_tags it
on i.id = it.image_id and
it.tag_id in (20, 21, 22)
group by i.id
having preftag = 20
order by maxscore desc
limit 1
) union all
(select i.id, max(score) as maxscore,
substring_index(group_concat(it.tag_id order by score desc), ',', 1) as prefTag
from image i join
acme_images_tags it
on i.id = it.image_id and
it.tag_id in (20, 21, 22)
group by i.id
having preftag = 21
order by maxscore desc
limit 1
) union all
(select i.id, max(score) as maxscore,
substring_index(group_concat(it.tag_id order by score desc), ',', 1) as prefTag
from image i join
acme_images_tags it
on i.id = it.image_id and
it.tag_id in (20, 21, 22)
group by i.id
having preftag = 22
order by maxscore desc
limit 1
)