我的书带有不同的标签(犯罪,奇妙,戏剧性等)。 那是我的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 标签是一片字符串。 “标签[]字符串”
答案 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.Array
有query := `... 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)