Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点使用mysql或lodash将多行合并为一行_Javascript_Mysql_Node.js_Express_Lodash - Fatal编程技术网

Javascript 节点使用mysql或lodash将多行合并为一行

Javascript 节点使用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

目前,我正在使用库在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'
    ]
}

无论如何,要使用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不支持数组。您可以使用表变量或逗号分隔字符串之类的内容