对于这个例子,我们有四个表。
此查询的目标是有一个包含单个游戏的时间表,然后根据游戏行中的ParentID获取与该游戏相关的所有游戏。
下面的JSON数据详细解释了这一点,我相信
/* 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。
查询返回的游戏如下:
SELECT ALL RELATED GAMES FROM SCHEDULE WHERE DIFFICULTY = 1应:
这里有一个SQLFiddle:http://sqlfiddle.com/#!9/f7583/5
目标是根据表中所有行的父id递归地查找原始id的所有条目。
关系:
'Mario Bros': [
'Super Mario bros': [ 'Mario Sunshine' ],
'Crazy Kong': [],
],
'Dog Fights': [
'War Thunder'
]发布于 2017-02-12 04:18:53
一种可能性
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
发布于 2017-02-12 04:35:09
最高可达3个级别:
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;https://stackoverflow.com/questions/42184008
复制相似问题