查询组件和聚合

时间:2016-10-17 13:28:50

标签: sql sqlite group-by having

我正在使用sqlite3。我宁愿继续使用它,但切换不是不可能的。

我有两张桌子:

card      face
----      ----
id        id
          card_id
          name
          position

cardface中有一个或多个条目。

卡片的规范名称是position订单中与“//”连接的面孔名称。

示例牌:'Dark Ritual',一张名为'Dark Ritual'的单张牌。 “研究//发展”,一张名为“研究”和“发展”的两张面孔的卡片

无论搜索字词是规范名称还是其中一张卡片的名称,我如何编写一张能够找到卡片详细信息的SELECT?

这是我走了多远:

SELECT id, GROUP_CONCAT(name, ' // ') 
FROM 
    (SELECT c.id, f.name
    FROM card AS c
    INNER JOIN face AS f ON c.id = f.card_id
    ORDER BY f.card_id, f.position)
GROUP BY id
HAVING GROUP_CONCAT(name, ' // ') IN (?)
OR name IN (?)

这找到了我正在寻找的卡片? =规范名称('研究//开发'。)当我提供只有一个面(“黑暗仪式”)或第二个的卡片名称时,它也会找到我要找的东西。两个名字('发展')。当我提供两个面名中的第一个('研究')时,它工作。我知道外部查询可以“看到”两个名称,因为它们都存在于名称的GROUP_CONCAT形式中。但查询第一个面部名称在HAVING中不起作用。

你能帮我理解为什么吗?谢谢!

1 个答案:

答案 0 :(得分:1)

试试这个版本:

HAVING SUM(CASE WHEN name IN (?) THEN 1 ELSE 0 END) > 0

请注意参数与列表不匹配。如果要传入逗号分隔列表,可以尝试:

HAVING SUM(CASE WHEN ',' || name || ',' LIKE '%,' || ? || ',%' THEN 1 ELSE 0 END) > 0