我有一个代表列表的表
id | item_type | item_id ---------------------------- 1 'article' 24 2 'post' 9 3 'article' 120 4 'image' 9
item_type基本上表示该行应该来自哪个表,而id是该表的ID。这意味着例如第二行和第四行不相同。
我想说说item_title和更多的列,这些列将根据每个表进行不同的创建。
假设如果item_type ='article',则item_title =该表的标题。
但是,如果item_type是'image',则item_title = author_first_name + author_second_name + image_id
等等...
我正在搜索它或如何处理它。特别是我认为我可以通过带有子查询的sql if语句来解决,但到目前为止还无法取得真正的进展。所以我想寻求帮助或指出正确的方向。
答案 0 :(得分:3)
尽管接受的答案是准确且相对简洁的,但也很费力。 (article
表已联接到post
和image
行,即使结果被丢弃。)
为了改进,您可以从...开始...
select
i.*,
case
when i.item_type = 'article' then a.title
when i.item_type = 'post' then p.post_title
when i.item_type = 'image' then g.author_first_name + g.author_second_name + g.image_id
end as item_title
from item i
left join article a on i.item_id = a.id AND i.item_type = 'article'
left join post p on i.item_id = p.id AND i.item_type = 'post'
left join image g on i.item_id = g.id AND i.item_type = 'image'
尽管很多优化师实际上并不喜欢那样。如果您真的想充分利用数据库,我会在item(item_type)
上放置一个索引,然后为每种类型使用显式逻辑...
SELECT i.*, a.title
FROM item i
LEFT JOIN article a ON i.item_id = a.id
WHERE i.item_type = 'acticle'
UNION ALL
SELECT i.*, p.post_title
FROM item i
LEFT JOIN post p ON i.item_id = p.id
WHERE i.item_type = 'post'
UNION ALL
SELECT i.*, g.author_first_name + g.author_second_name + g.image_id
FROM item i
LEFT JOIN image g ON i.item_id = g.id
WHERE i.item_type = 'image'
long绕的时间更长,但更加明确和友好。
答案 1 :(得分:0)
您可以对所有这些表执行userDetailsService(CustomUserDetailsService) {
it.autowire = true
apiService = ref('apiService')
}
,并使用适当的列组成标题,如:
OUTER JOIN