如何通过JOIN语句将多查询结果合并到单个字段/单元格
解决同一用户借阅书籍名称合并为单个字段的SQL方案
你需要用**GROUP_CONCAT()**函数来实现同一用户的书籍名称合并,这是MySQL(Drupal默认数据库)中专门用来将分组内的字符串拼接成单个字段的函数。结合你的表结构,完整的SQL查询语句如下:
SELECT p.name, p.ID, p.age, GROUP_CONCAT(b.title SEPARATOR ', ') AS borrowed_books FROM People p INNER JOIN `borrow records` br ON p.ID = br.person_id INNER JOIN Books b ON br.book_id = b.id WHERE p.age >= 18 GROUP BY p.ID, p.name, p.age;
关键部分解释:
GROUP_CONCAT(b.title SEPARATOR ', '):将每个用户分组内的书籍标题用,分隔拼接成一个字符串,完全匹配你需要的格式。GROUP BY p.ID, p.name, p.age:必须按用户的唯一标识(ID)及其他需展示的字段分组,这样GROUP_CONCAT才会针对每个用户单独拼接书籍列表。- 表名转义:因为
borrow records表名包含空格,所以用反引号`括起来避免语法错误。
可选调整:
如果需要包含18岁以上但从未借过书的用户,把INNER JOIN改成LEFT JOIN,此时这些用户的borrowed_books字段会显示为NULL:
SELECT p.name, p.ID, p.age, GROUP_CONCAT(b.title SEPARATOR ', ') AS borrowed_books FROM People p LEFT JOIN `borrow records` br ON p.ID = br.person_id LEFT JOIN Books b ON br.book_id = b.id WHERE p.age >= 18 GROUP BY p.ID, p.name, p.age;
针对Drupal实际场景的适配:
你提到实际是要获取特定节点的分类名称,这里给你一个参考示例(假设节点类型为article,分类字段的词汇ID为5):
SELECT n.title AS node_title, n.nid AS node_id, GROUP_CONCAT(td.name SEPARATOR ', ') AS category_names FROM node n INNER JOIN taxonomy_index ti ON n.nid = ti.nid INNER JOIN taxonomy_term_data td ON ti.tid = td.tid WHERE n.type = 'article' AND td.vid = 5 -- 指定词汇ID GROUP BY n.nid, n.title;
这个查询会把每个文章节点对应的分类名称合并成单个字段,逻辑和图书借阅场景完全一致。
内容的提问来源于stack exchange,提问作者user3713929
相关产品推荐
相关产品推荐

