使用嵌套循环插入缺失值

时间:2017-12-01 15:06:24

标签: mysql for-loop while-loop nested-loops

我有一张events表,其中包含年份,与会者人数以及从location表中查找该位置的位置。

tbl_events

+-----+--------------+------+-----------+--------+
| ID  |  LOCATION_ID | YEAR | ATTENDEES | RATING |
+-----+--------------+------+-----------+--------+
| 1   | 1            | 2014 | 44        | 6      |
| 2   | 2            | 2014 | 36        | 7      |
| 3   | 4            | 2014 | 51        | 7      |
| ... | ...          | ...  | ...       | ...    |
| 74  | 2            | 2015 | 59        | 6.5    |
| 75  | 4            | 2015 | 31        | 5      |
| 76  | 12           | 2015 | 66        | 8      |
| ... | ...          | ...  | ...       | ...    |
| 133 | 5            | 2016 | 71        | 8.5    |
| 134 | 32           | 2016 | 68        | 6.5    |
| 135 | 14           | 2016 | 59        | 7.5    |
| ... | ...          | ...  | ...       | ...    |
+-----+--------------+------+-----------+--------+

tbl_locations

+-----+-------------+
| ID  |    Name     |
+-----+-------------+
| 1   | Falmouth    |
| 2   | Plymouth    |
| 3   | Exeter      |
| 4   | Bristol     |
| 5   | Bournemouth |
| 6   | Southampton |
| ... | ...         |
| 99  | Edinburgh   |
| 100 | Glasgow     |
+-----+-------------+

我只记录了发生的事件,其中包括年份,地点,与会者和评级所需的信息。

我想添加缺失值行,以包含表中所有年份locations表中的所有位置。

所以我认为(理想情况下)我需要在每年中嵌套一个遍历表的循环,并循环遍历location表中的所有位置,并将缺失的行直接插入{ {1}}表,或者进入临时表,然后我可以将其插入到事件表中。

我想用几年加入事件和位置表并插入临时表的替代方案。然后在事件表中插入事件表中不包含的所有行。

欢迎任何其他想法,但我仅限于在MySQL中执行此操作。

理想情况下,我可以将其保存为程序并稍后重新运行。

1 个答案:

答案 0 :(得分:0)

您可以cross join地点和所有年份来获得完整的组合。他们刚刚在实际事件中加入他们,所以你在缺少事件的插槽中得到null s(或其他一些自定义值)的行:

SELECT     e.*
FROM       tbl_locations l
CROSS JOIN (SELECT DISTINCT year FROM events) y 
LEFT JOIN  events e ON l.id = e.location_id AND y.year = e.year