我正在构建一个使用 SQLite 的小型 Rust 应用程序。
我有一个包含名称的表和一个包含代码的字符串:
├───────────────────────────────────┼────────────────┼
│ "Abaddon the Despoiler" │ "UBR" │
├───────────────────────────────────┼────────────────┼
│ "Admiral Beckett Brass" │ "UBR" │
├───────────────────────────────────┼────────────────┼
│ "Arcades, the Strategist" │ "WUG" │
├───────────────────────────────────┼────────────────┼
我还有一张表格,其中包含组成代码的字母。目标是获得如下所示的表格(以上面三行为例):
┌───────┬───────┐
│ Color │ Count │
├───────┼───────┤
│ "B" │ 2 │
├───────┼───────┤
│ "C" │ 0 │
├───────┼───────┤
│ "G" │ 1 │
├───────┼───────┤
│ "R" │ 2 │
├───────┼───────┤
│ "U" │ 3 │
├───────┼───────┤
│ "W" │ 1 │
└───────┴───────┘
如您所见,字母“U”出现了 3 次(第一个表的每一行中出现一次),因此计数为 3。对于第二个表的六个字母,字母“B”同样出现两次,依此类推。
如何编写一个
SELECT
请求来计算第二个表左侧列中出现在第一个表右侧列中的每个字符的出现次数?
我做了这样的尝试:
SELECT color.name AS [Color],
SUM(CASE WHEN deck.color LIKE '%W%' THEN 1 ELSE 0 END) AS [Count]
FROM color, deck
GROUP BY color.name ORDER BY [Count], [Color]
但它一次仅适用于一个字母。我不知道如何将
LIKE
语句与变量模式一起使用。
由于需要所有字母,所以我们采用包含单个字母的字母表,我将其命名为字母作为示例。 所以假设字母表有
信 |
---|
B |
C |
G |
R |
你 |
W |
然后我们可以将字母与您的代码表进行 LEFT JOIN 来查找字母是否存在于代码表中
SELECT
l.letter,
COUNT(n.name) AS Count
FROM
letters l
LEFT JOIN names_codes n ON n.code LIKE '%' || l.letter || '%'
GROUP BY l.letter
ORDER BY l.letter;
输出
信 | 数 |
---|---|
B | 2 |
C | 0 |
G | 1 |
R | 2 |
你 | 3 |
W | 1 |