在SQL SELECT语句中创建循环,直到链断开

时间:2014-02-09 11:06:48

标签: mysql sql database select

世界各地发生事件的假设数据库。

EVENT

event_id | event_name
1        | Great Wall Party
2        | Times Square Dance
3        | Sydney Blowout

PLACE

place_id | place_name
54       | Times Square
55       | Manhattan
56       | New York City
57       | New York State
58       | USA

EVENTPLACE

eventid | placeid
2       | 54

RELATEDPLACES

rel_placeid1 | rel_placeid2
54           | 55
55           | 56
56           | 57
57           | 58

如果我展示活动,时代广场舞,我想通过RELATEDPLACES表(即时代广场,曼哈顿,纽约市,纽约州,显示出现在其相关地点链上的所有地方)美国)。同样,如果我将所有活动称为美国,我希望将时代广场的舞蹈列入其中,因为它的EVENTPLACE(时代广场)出现在从美国开始的RELATEDPLACES协会链的底部。

我认为我需要在我的SQL命令中创建一个内部循环,以便它一直执行,直到链中断。到目前为止(使用上面两个例子中的第一个)我有: -

SELECT place_nm FROM eventplace
INNER JOIN relatedplaces ON placeid = rel_placeid1
INNER JOIN place ON rel_placeid2 = place_id
[where the loop should begin:
INNER JOIN relatedplaces ON place_id = rel_placeid1
INNER JOIN place ON rel_placeid2 = place_id
end loop]
WHERE eventid = ‘2’;

由于我需要为每个循环使用不同的表别名,这很复杂,这意味着我无法在打开的SELECT语句中声明我想要在同一列中收集所有place_name数据。

我不确定我想要达到的目标是否可能,我目前的后备解决方案是列出所有时代广场在RELATEDPLACES表中的相关位置,而不仅仅是下一个最大的地方(曼哈顿),但是这似乎是更好的解决方案(并且还可以节省数据库空间)。

有人可以建议我可能需要使用的SQL SELECT命令吗?干杯!

1 个答案:

答案 0 :(得分:0)

相当有趣的问题。但问题是MySQL目前不允许递归查询。您有两种选择:

  1. 决定要挖掘的RelatedEvents级别,并为其创建查询(使用excel或小型C代码)
  2. 使用程序即时生成和执行查询;从程序中递归地进行数据库查询。我建议这是最好的选择,但需要重复访问数据库。