如何对列表的所有元素进行“和”运算符?

时间:2018-06-26 16:30:16

标签: sql postgresql go

我的书带有不同的标签(犯罪,奇妙,戏剧性等)。 那是我的sql代码:

query := `
    SELECT gotoboox.books.id, gotoboox.books.title 
    FROM gotoboox.books 
    LEFT JOIN gotoboox.books_tags ON gotoboox.books.id = gotoboox.books_tags.book_id 
    LEFT JOIN gotoboox.tags ON gotoboox.books_tags.tag_id = gotoboox.tags.id 
    WHERE gotoboox.tags.title IN ($1) 
    GROUP BY gotoboox.books.title, gotoboox.books.id
`
rows, err := p.Db.Query(query, pq.Array(tags))

但是我得到的结果是空的。 例如,如果我写

..WHERE gotoboox.tags.title IN ('Crime', 'Comedia').. // WITHOUT pg.Array()

没关系。

所以,我需要将我的pq.Array(tags)正确传递给“ where in”语句。

PS 标签是一片字符串。 “标签[]字符串”

2 个答案:

答案 0 :(得分:1)

类似这样的东西:

MyDragShadowBuilder

或多或少是一种简短的书写方式:

cardView.draw(canvas)

因此,除非gotoboox.tags.title IN ('Crime', 'Comedia') 本身是一个数组(不是),否则您不想在gotoboox.tags.title = 'Crime' or gotoboox.tags.title = 'Comedia' 中为占位符提供数组。

如果要为占位符传递切片并使用IN ($1),则要在SQL中使用= ANY(array)

tags.title

或者,如果pq.Arrayquery := `... WHERE gotoboox.tags.title = any ($1) ...` rows, err := p.Db.Query(query, pq.Array(tags)) 个元素,那么您可以构建一个像这样的字符串:

tags

n放入您的SQL中(这非常安全,因为您确切知道字符串中的内容):

"$1,$2,...,$n"

,然后在查询时为所有这些占位符提供值:

fmt.Sprintf

答案 1 :(得分:0)

以下查询将产生带有所有选定标签的书。

select 
  b.id, 
  b.title 
from 
  books b 
  join books_tags bt on bt.book_id = b.id 
  join tags t on bt.tag_id = t.id 
where 
  t.title = any($1) 
group by 
  b.id, 
  b.title 
having 
  count(*)= cardinality($1)