Javascript 节点使用mysql或lodash将多行合并为一行
目前,我正在使用库在Javascript框架中实现MySQL查询。我有一个关于多行左连接的问题。当我离开该表时,它返回多个对象,这是因为左连接将产生重复的行,但该特定属性的值不同。我现在想要实现的是,返回一个对象并将多个值插入到该特定属性的数组中 表AJavascript 节点使用mysql或lodash将多行合并为一行,javascript,mysql,node.js,express,lodash,Javascript,Mysql,Node.js,Express,Lodash,目前,我正在使用库在Javascript框架中实现MySQL查询。我有一个关于多行左连接的问题。当我离开该表时,它返回多个对象,这是因为左连接将产生重复的行,但该特定属性的值不同。我现在想要实现的是,返回一个对象并将多个值插入到该特定属性的数组中 表A id | name | age 1 abel 22 2 john 22 表B id | user_id | equip 1 1 armor 2 2 sword 3 1
id | name | age
1 abel 22
2 john 22
表B
id | user_id | equip
1 1 armor
2 2 sword
3 1 knife
4 2 gun
查询
SELECT * FROM Table_A LEFT JOIN TABLE_B ON TABLE_B.user_id = TABLE_A.id;
当前情况
{
id: 1
name: abel
age: 22
user_id: 1
equip: 'armor'
},
{
id: 1
name: abel
age: 22
user_id: 1
equip: 'knife'
},
{
id: 2
name: john
age: 22
user_id: 2
equip: 'sword'
},
{
id: 2
name: john
age: 22
user_id: 2
equip: 'gun'
}
我想要实现的目标
{
id: 1
name: abel
age: 22
user_id: 1
equip: [
'armor','knife'
]
},
{
id: 2
name: john
age: 22
user_id: 2
equip: [
'sword','gun'
]
}
无论如何,要使用query或lodash来实现这一点?使用连接无法完成您尝试的操作。下面是我的想法,尽管SQL向导可能有更好的解决方案:
SELECT Table_A.name, GROUP_CONCAT(item_name) AS equip
FROM Table_B
JOIN Table_A
ON Table_A.id=Table_B.person_id
WHERE Table_A.id=1;
这将产生
+------+-------------------+
| name | person_items |
+------+-------------------+
| abel | armor,sword,knife |
+------+-------------------+
然后用拆分(',')
创建一个数组。但我看到一些问题超出了你试图解决的问题
表B
做的工作太多。删除user\u id
列,创建第三个表table\u table\u B
,其中有三列:id
主键,table\u id
外键引用table\u a
id
table_b_id
外键引用table_b
id
除非以这种方式更改表,否则每次向表B添加行时都需要输入项名称。消除这种冗余,并正确使用关系数据库,方法是在其自己的表中创建/插入项一次,并在需要连接时使用子表指向它和表a
中的实体(这是表A\u表B
)
名称需要更具描述性和准确性,例如表A
->人员
,表B
->项目
,以及表A\u表B
->'person\u项目,
装备->项目名称`
第一步:
CREATE TABLE people (
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT UNSIGNED
);
CREATE TABLE items (
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
item_name VARCHAR(20)
);
CREATE TABLE person_item (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
person_id INT UNSIGNED NOT NULL,
item_id INT UNSIGNED NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (person_id)
REFERENCES people(id)
ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (item_id)
REFERENCES items(id)
ON UPDATE CASCADE ON DELETE CASCADE
);
混合一些数据:
INSERT INTO people (name, age) VALUES ('abel', 20), ('john', 21);
INSERT INTO items (item_name) VALUES ('armor'), ('sword'), ('knife');
INSERT INTO person_item (person_id, item_id) VALUES (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3);
MySQL不支持阵列,我认为,对于您想要做的事情,最好的做法是完全不支持阵列,而是这样做:
SELECT p.*, i.*
FROM people p
JOIN person_item pi
ON p.id=pi.person_id
JOIN items i
ON i.id=pi.item_id
WHERE p.id=1;
这将产生:
+------+-----+-----------+
| name | age | item_name |
+------+-----+-----------+
| abel | 22 | armor |
| abel | 22 | sword |
| abel | 22 | knife |
+------+-----+-----------+
然后,您可以使用Node获取所需的数据。也可以执行以下操作:
SET sql_mode='';
SELECT people.name, GROUP_CONCAT(item_name) AS person_items
FROM items
JOIN person_item
ON person_item.item_id=items.id
JOIN people
ON people.id=person_item.person_id
WHERE people.id=1;
制作:
+------+-------------------+
| name | person_items |
+------+-------------------+
| abel | armor,sword,knife |
+------+-------------------+
您所要求的根本不是左连接,左连接连接行而不是特定列SQL不支持数组。您可以使用表变量或逗号分隔字符串之类的内容