首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于MySQL的递归获取条目的parentID查询

基于MySQL的递归获取条目的parentID查询
EN

Stack Overflow用户
提问于 2017-02-12 03:46:36
回答 2查看 48关注 0票数 1

对于这个例子,我们有四个表。

  • 困难
  • 游戏
  • 设备
  • 时间表

此查询的目标是有一个包含单个游戏的时间表,然后根据游戏行中的ParentID获取与该游戏相关的所有游戏。

下面的JSON数据详细解释了这一点,我相信

代码语言:javascript
复制
/* GAMES */ {
    id: 1,
    name: 'Mario Bros',
    parent: null
}, {
    id: 2,
    name: 'Super Mario Bros',
    parent: 1
}, {
    id: 3,
    name: 'Crazy Kong',
    parent: 1
}, {
    id: 4,
    name: 'Mario Sunshine',
    parent: 2
}, {
    id: 5,
    name: 'Dog Fights',
    parent: null,
}, {
    id: 6,
    name: 'War Thunder',
    parent: 5
}, {
    id: 7,
    name: 'Pacman',
    parent: null
 }

/* SCHEDULE */ {
    difficulty: 1,
    weekday: 1,
    game: 1
}, { 
    difficulty: 1,
    weekday: 1,
    game: 5
}, {
    difficulty: 2,
    weekday: 1,
    game: 7
}

在这些数据中,时间表由两个游戏(1, 5)组成,在游戏数据中,id (1)的游戏有三个游戏,它们通过parent与之相关:

超级马里奥兄弟和疯狂金刚与数据直接相关,parent被设置为(1)Mario Sunshine与游戏id (1)间接相关,因为它的母公司设置为超级马里奥兄弟(2)

id (5)的另一个游戏( id id为1 )也有一个与其相关的游戏,即War Thunder,它的父游戏设置为5。

帕克曼有一个2的困难,所以它将永远不会被提起,除非你从时间表中寻找困难2,然后其他6场比赛将永远不会出现。

我需要一个查询,可以找到所有的相关游戏的基础上的进度表,这是检索困难id。

查询返回的游戏如下:

代码语言:javascript
复制
SELECT ALL RELATED GAMES FROM SCHEDULE WHERE DIFFICULTY = 1

应:

  • 马里奥·布罗斯
  • 超级马里奥兄弟
  • 疯狂的金刚
  • 马里奥阳光
  • 狗斗
  • 战争雷霆

这里有一个SQLFiddle:http://sqlfiddle.com/#!9/f7583/5

目标是根据表中所有行的父id递归地查找原始id的所有条目。

关系:

代码语言:javascript
复制
'Mario Bros': [
    'Super Mario bros': [ 'Mario Sunshine' ],
    'Crazy Kong': [],  
 ],
 'Dog Fights': [
    'War Thunder'
  ]
EN

回答 2

Stack Overflow用户

发布于 2017-02-12 04:18:53

一种可能性

代码语言:javascript
复制
SELECT schedules.*, games.name
FROM schedules
INNER JOIN games ON games.id = schedules.gameId or games.parentId = schedules.gameId
WHERE schedules.weekday = 1
AND difficultyId = 1;

下面是一个工作演示http://sqlfiddle.com/#!9/f7583/57

票数 0
EN

Stack Overflow用户

发布于 2017-02-12 04:35:09

最高可达3个级别:

代码语言:javascript
复制
CREATE TEMPORARY TABLE temp_sc (
id INT NOT NULL,
gameId INT,
name VARCHAR(255),
difficultyId INT,
weekday INT,
variation TINYINT(1) default false,
deviceId INT NOT NULL,
parentId INT DEFAULT NULL
);

INSERT INTO temp_sc (id, gameId, name, difficultyId, weekday, deviceId, parentId)
SELECT distinct sc.id, g3.id, g3.name, sc.difficultyId, sc.weekday, g3.deviceId, g3.parentId
FROM schedules as sc 
LEFT JOIN games as g1 ON g1.id = sc.gameId
LEFT JOIN games as g2 ON g2.parentid = g1.id || g2.id=g1.id
LEFT JOIN games as g3 ON g3.parentid = g2.id || g3.id=g2.id
WHERE sc.weekday = 1
AND sc.difficultyId = 1;

SELECT temp_sc.name as 'Game Name', temp_sc.gameId as 'Game ID', temp_sc.parentId as 'References ID', dev.name as 'Device' FROM temp_sc
LEFT JOIN devices as dev ON temp_sc.gameID = dev.id;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42184008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档