[英]MySQL Many-to-Many Relationship Select Conditions
我有兩個表書和標簽,它們通過表books_tags具有多對多關系。 我想做的是選擇所有帶有一個或多個標簽(如“%tag%”)的圖書。 沒問題。 但是,我還有一個group_concat字段,我想用與所選書本相關的所有標簽來填充。
我的選擇查詢基本上看起來像這樣:
select
flbdb_books.id,
flbdb_books.title,
flbdb_tags.id,
flbdb_tags.name,
group_concat(distinct concat('["', flbdb_tags.id, '","', flbdb_tags.name, '"]') separator ',') as tags
from
flbdb_books
join flbdb_books_tags
on flbdb_books.id = flbdb_books_tags.book_id
join flbdb_tags
on flbdb_tags.id = flbdb_books_tags.tag_id
group by flbdb_books.id;
如果我沒有任何條件,這將提供理想的結果。 我使用PHP和json_decode讀取標簽字段。 我嘗試了三種不同的方法來過濾結果,但是沒有一種有效。
在以下地方使用:
where flbdb_tags.name like '%poetr%'
但是,這意味着標簽字段(使用group_concat組裝的標簽字段)僅填充了此標簽
使用具有
having flbdb_tags.name like '%poetr%'
這不會返回所有標記有詩歌的書籍,因為在某些情況下,由於分組依據,詩歌標簽被隱藏在另一個標簽的后面
使用在group_concat字段上
having tags like '%poetr%'
這實際上可以解決問題,但是我需要進行不區分大小寫的搜索,並且upper(tags)不起作用
我希望很清楚我想做什么。
謝謝
對您有用嗎?
select
flbdb_books.id,
flbdb_books.title,
COUNT(CASE
WHEN flbdb_tags.name LIKE '%poetr%' THEN 1
END) as num_poetry,
group_concat(distinct concat('["', flbdb_tags.id, '","', flbdb_tags.name,
'"]') separator ',') as tags
from
flbdb_books
join flbdb_books_tags
on flbdb_books.id = flbdb_books_tags.book_id
join flbdb_tags
on flbdb_tags.id = flbdb_books_tags.tag_id
group by flbdb_books.id
HAVING num_poetry >0;
不確定我是否清楚理解,但是我會嘗試包裝您的原始選擇並在包裝選擇中進行過濾
select * from (
select
flbdb_books.id,
flbdb_books.title,
flbdb_tags.id,
flbdb_tags.name,
group_concat(distinct concat('["', flbdb_tags.id, '","', flbdb_tags.name, '"]') separator ',') as tags
from
flbdb_books
join flbdb_books_tags
on flbdb_books.id = flbdb_books_tags.book_id
join flbdb_tags
on flbdb_tags.id = flbdb_books_tags.tag_id
group by flbdb_books.id) inner_select
where upper(inner_select.name) like '%herpderp%'
有一個關系查詢可以完全滿足您的需求。
洞察力是,過濾器標簽是您的起點,實際上,您需要從標簽連接到書本再回到標簽。
select
books.id,
books.title,
tags.id,
tags.name,
group_concat(distinct concat('["', tags.id, '","', tags.name, '"]') separator ',') as tags
from flbdb_tags filter_tag
join flbdb_books_tags filter_book_tags
on filter_tag.id = filter_book_tags.tag_id
join flbdb_books books
on filter_book_tags.book_id = books.id
join flbdb_books_tags books_tags
on books.id = books_tags.book_id
join flbdb_tags tags
on tags.id = books_tags.tag_id
where filter_tag.name like '%poetr%'
group by books.id;
您需要加入兩次,而不是一次,因為過濾的標簽是書的所有標簽所不同的數據集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.