簡體   English   中英

MySQL多對多關系選擇條件

[英]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讀取標簽字段。 我嘗試了三種不同的方法來過濾結果,但是沒有一種有效。

  1. 在以下地方使用:

    where flbdb_tags.name like '%poetr%'

    但是,這意味着標簽字段(使用group_concat組裝的標簽字段)僅填充了此標簽

  2. 使用具有

    having flbdb_tags.name like '%poetr%'

    這不會返回所有標記有詩歌的書籍,因為在某些情況下,由於分組依據,詩歌標簽被隱藏在另一個標簽的后面

  3. 使用在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM