我有这个表设置(简化):
ads
- id
- brand_id
brands
- id
tags
- taggable_type
- taggable_id
- tag
代码表中的taggable_type将为“Ad”或“Brand”,taggable_id将分别标识ad_id或brand_id,然后标记为字符串。
广告继承了他们品牌的标签,我正在尝试编写一个搜索查询,为一组给定的标签提取一组广告,其中这些标签属于广告本身或与该广告相关联的品牌。
这些表都可能相当大,所以我需要它才能有效。
这就是我所拥有的(这不起作用)
SELECT
a.*
FROM
ads a
JOIN
((
SELECT
*
FROM
tags
WHERE
tag IN ({$tags})
AND taggable_type = "Ad"
) t FULL JOIN (
SELECT
*
FROM
tags
WHERE
tag IN ({$tags})
AND taggable_type = "Brand"
)) tt
ON (t.taggable_id = a.id) OR (tt.taggable_id = a.brand_id);
首先,我在完整加入时遇到错误。我也尝试过内连接和左连接,它仍然无法正常工作。我觉得我只是在做一些从根本上说愚蠢的事情。有什么帮助吗?
答案 0 :(得分:1)
像这样它应该起作用
SELECT DISTINCT
ads.*
FROM
ads
LEFT JOIN brands
ON ads.brand_id = brands.id
INNER JOIN tags
ON (
tags.taggable_type = 'brand'
AND brands.id = tags.taggable_id)
OR (
tags.taggable_type = 'ad'
and ads.id = tags.taggable_id)
WHERE
tags.tag IN ('tag 1', 'tag 2', 'tag 7')
但您可能还想再考虑一下您的数据库结构。 也许像下面这样的设置会更适合你。
ads(id, brand_id)
brands(id)
tags(id)
tags_ads(tag_id, ad_id)
tags_brands(tag_id, brand_id)
可以将标签分配给多个品牌或广告。或者是品牌和广告...