【发布时间】:2021-10-27 01:17:44
【问题描述】:
我在这里看到过类似的问题,但我找到的解决方案似乎都没有给我想要的结果。
所以我有两张桌子:
卡片表包含具有唯一 ID 和其他元数据(铸造成本等)的收藏卡片:
Cards
| id INTEGER | name TEXT | ... |
Prints 表包含 Cards 表中卡片的打印信息(这是因为同一张卡片可以通过不同的卡片组打印出不同的版本):
Prints
| id INTEGER | card_id INTEGER | set TEXT | ... |
我想做的是能够查询给定的卡片,但在单行响应中包含所述卡片的所有打印。在某种程度上,我已经能够做到这一点,但是如果一张卡片有 6 次打印,它将产生 6 行,每行包含所有打印信息,作为 JSON 格式的字符串。
我一直在尝试使用的查询如下:
SELECT DISTINCT(cards.id), cards.*, array_agg(printings.*) FROM cards
LEFT JOIN printings ON cards.id=printings.card_id
WHERE cards.name="C1"
GROUP BY cards.id,printings.id ORDER BY cards.id;
这导致输出如下(并且打印信息只是一个字符串):
| id | name | ... | printing_information |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
| 1 | C1 | ... | { printInfo1, printInfo2, printInfo3 } |
我希望能够将打印件与卡片连接起来,以便产生响应:
| id | name | ... | printing_information |
| 1 | C1 | ... | { print1Info, print2Info, print3Info } |
| 2 | C2 | ... | { print1Info, print2Info } |
是否值得在一个查询中完成所有这些操作?我可以通过一些小的后期处理来实现这一点,但这是否会像需要多个查询一样高效,并且不会那么漂亮,因为它可能用于多张卡片并且搜索多个 id 似乎很混乱。
任何帮助将不胜感激!
【问题讨论】:
-
请注意,
distinct不是一个函数。它始终适用于选择列表中的 所有 列。用括号括住其中一列不会改变任何东西并且是无用的。distinct (a),b,c与distinct a,(b),c或distinct a,b,(c)或distinct a,b,c相同。结合group by就更没用了 -
感谢您的解释。 Distinct 更像是晚上的最后一次尝试,看看它是否只会给我一行而不是我看到的 6 行。
标签: sql arrays postgresql join