我在本地服务器中使用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我的朋友的名字和喜欢的NBA球队,这显然是多对多的关系。由于这个原因,我在MySQL中运行以下脚本来为此数据库创建适当的表:
CREATE TABLE `friends` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `teams` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `relations` (
`friends_id` int(4) NOT NULL,
`teams_id` int(4) NOT NULL,
)
显然,我在这些表中插入了一些值,但是为了节省空间,此处没有提供大量源代码。其中的一小部分如下:
INSERT INTO `friends` (`id`, `name`)
VALUES
(1,'David Belton'),
(2,'Alex James');
INSERT INTO `teams` (`id`, `name`)
VALUES
(1,'Cleveland Cavaliers'),
(2,'Boston Celtics');
INSERT INTO `relations` (`friends_id`, `teams_id`)
VALUES
(1,1),
(2,1),
(2,2);
运行从数据库中获取数据并打印它们的PHP脚本后,我想为我的每个朋友提供以下有效的json输出:
{
"id": "1",
"name": "Alex James",
"team": ["Boston Celtics", "Cleveland Cavaliers"]
}
如何使用MySQL为每个人组成这个最喜欢的团队?
PS我假设在使用PHP检索数据之前最好在MySQL中完成此操作。
“简便”方法是使用CONCAT生成JSON。
并使用GROUP_CONCAT将多个团队记录合并到一个JSON数组中。
此方法也可在不支持创建JSON函数的旧MySQL版本中使用。
询问
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id = 1
结果
| json |
|-----------------------------------------------------------------|
| {"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]} |
演示
http://www.sqlfiddle.com/#!9/4cd244/19
编辑了更多朋友
询问
SET SESSION group_concat_max_len = @@max_allowed_packet
SELECT
CONCAT(
"["
, GROUP_CONCAT(json_records.json) # combine json records into a string
, "]"
) AS json
FROM (
SELECT
CONCAT(
"{"
, '"id"' , ":" , '"' , friends.id , '"' , ","
, '"name"' , ":" , '"' , friends.name , '"' , ","
, '"team"' , ":" , "["
, GROUP_CONCAT('"', teams.name, '"')
, "]"
, "}"
) AS json
FROM
friends
INNER JOIN
relations
ON
friends.id = relations.friends_id
INNER JOIN
teams
ON
relations.teams_id = teams.id
WHERE
friends.id IN(SELECT id FROM friends) #select the friends you need or just simply friends.id IN(1, 2)
GROUP BY
friends.id
)
AS json_records
结果
| json |
|--------------------------------------------------------------------------------------------------------------------------------------------------|
| [{"id":"1","name":"David Belton","team":["Cleveland Cavaliers"]},{"id":"2","name":"Alex James","team":["Boston Celtics","Cleveland Cavaliers"]}] |
演示
http://www.sqlfiddle.com/#!9/4cd244/61
> 我有3个实体用户、应用程序和角色。 null null Role1.getUsers().Add(user);Role1.getUsers().Add(user); role2.getUsers().add(user);role2.getUsers().add(user); user.getApplications().add(app1);user.getApplications().add(
问题内容: 我有2张桌子: 电影:movieID 用户:userID 这些表通过Queue表具有多对多关系,并带有一个附加属性listOrder: 队列:movieID,userID,listOrder 我正在尝试使用EclipseLink对此模型建模,但是却收到“不兼容映射”错误。这是我的代码的示例: QueueItemPK的目的是使我可以拥有movieID和userID的复合主键。我不确定这是
我有3个标签:用户、教师和帖子。 用户: id-integer name-string 教师: id-integer 教师id-integer 用户id-integer 姓名-string 帖子: id-integer user\u id-integer title-string 用户模型: 教师模式: ??问题是我如何使用这样的东西:
如果我尝试以下操作,则页面正在加载: 有以下表格:-用户-user_department-部门 数据透视表用户\u部门有两个外键:-部门\u id-用户\u id 在我的用户模型中: 在我的部门模型中: 顺便说一下:以下代码正在工作: 但是我无法在不破坏我的页面的情况下获得用户的部门。 有什么想法吗?
我使用的是Laravel 5.4,其模型和表格结构如下: 一个用户可以有多个账户 一个帐号可以被多个用户共享 每个账户有多个持有量 因此,用户通过他们的许多帐户间接拥有许多资产。 我需要帮助在用户模型上定义一个称为“持有量”的关系,以获得适用于用户的所有持有量(基于他们所链接的账户)。 我尝试了很多不同的东西,在谷歌上花了很长时间。我可以接近BelongToMany和hasManyThrough,
我有一个关于Hibernate ManyToMany映射的问题。我有两个类 A 和 B,它们之间的映射是由 Hibernate 解析的 ManyToMany 映射: 用户和组的外键是“A_id”和“B_id”。联接表称为A_B。 现在,我想加上C。我想A_B与C有关系,与C创建多对多关系,A_B我可以称之为A_B_C。 编辑:所以我会创建一个_B实体,A和B和A_B的关系为2 @OneToMany