目前,我正在使用Node MySQL库在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 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'
]
}
无论如何要使用node mysql查询或lodash?
答案 0 :(得分:0)
您尝试做的事情无法通过加入完成。这是我想出的,尽管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 |
+------+-------------------+
然后只需创建一个split(',')
的数组。但我发现除了你想要解决的问题之外还有一些问题。
Table_B
做了太多工作。删除user_id
列并创建第三个表Table_A_Table_B
,其中包含三列:id
主键,table_a_id
外键引用Table_A
。{{1 }}; id
外键引用table_b_id
。Table_B
。
除非您以这种方式更改表,否则每次向表B添加行时都需要输入项名称。通过在其中创建/插入项目,消除冗余并正确使用关系数据库自己的表,并在需要连接它们时使用子表指向它和id
中的实体(即Table_A
)。
名称需要更具描述性和准确性,例如。 Table_A_Table_B
- > Table_A
,people
- > Table_B
和items
- > “person_item Table_A_Table_B
{装备{1}} item_name`。
从第一个方面开始:
,
混合一些数据:
->
MySQL不支持数组,我认为,你想做的最佳实践根本就不是这样做,而是要做到这一点:
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);
然后您可以使用Node来获取所需的数据。或者你可以这样做:
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 |
+------+-----+-----------+