Node使用mysql或lodash将多行合并为一行

时间:2017-05-28 03:46:37

标签: javascript mysql node.js express lodash

目前,我正在使用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?

1 个答案:

答案 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_idTable_B

除非您以这种方式更改表,否则每次向表B添加行时都需要输入项名称。通过在其中创建/插入项目,消除冗余并正确使用关系数据库自己的表,并在需要连接它们时使用子表指向它和id中的实体(即Table_A)。

名称需要更具描述性和准确性,例如。 Table_A_Table_B - > Table_Apeople - > Table_Bitems - > “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     |
+------+-----+-----------+