Py学习  »  DATABASE

MySQL选择value并检查它是否在另一列的同一个表中可用,然后再次检查,直到没有新的匹配值

Steffen • 3 年前 • 1108 次点击  

我想创建一个小型房间组织工具,因此我有一个名为“房间”的表格:

+---------+-------------+-------------+
| room_id |  room_name  | information |
+---------+-------------+-------------+
|       1 | 101         | single room |
|       2 | 102         | single room |
|       3 | 103         | single room |
|       4 | 108         | single room |
|       5 | 101&102     | linked room |
|       6 | 101&102&103 | linked room |
+---------+-------------+-------------+

在这张桌子上,我有单人间和相连的房间。 单人房:可以是链接房间的一部分,但不一定是这样。 链接房间:将两个单人房间连接在一起,例如:room_id 5连接到rooom_id 1和2。

这就是我要努力解决的问题。我怎样才能把所有的房间都连接起来呢。 例如:我选择房间3。现在,输出应该是room_id 1、2、3、5和6的行。 因为:3是链接房间6的一部分。 6是一个由1、2和3组成的连接房间。 1和2是链接房间5的一部分。

对于链接,我创建了另一个名为room_links的表(如果没有额外的表,还有其他方法可以实现,那就完全可以了,但这似乎是对我来说最好的方法):

+---------+----------------+
| room_id | linked_room_id |
+---------+----------------+
|       5 |              1 |
|       5 |              2 |
|       6 |              1 |
|       6 |              2 |
|       6 |              3 |
+---------+----------------+

有人能告诉我一个问题来读出我需要的信息吗?还是给我一点思考的食物?我是MySQL的新手。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133046
 
1108 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Gordon Linoff
Reply   •   1 楼
Gordon Linoff    3 年前

您可以通过数据模型实现这一点:

select t.*
from t join
     t tsingle
     on concat('&', t.room_name, '&') like concat('%', tsingle.room_name, '%')
where t.room_name like '%&%' and
      tsingle.room_name not like '%&%';

我建议修复数据模型,但这可能很棘手。我猜你想要一个 room_id 这涵盖了单间和相连的房间。所以,建议是为房间准备一张桌子,就像上面提到的那样,但是没有桌子 room_name (或者你可以离开它)。你可能想要一个 room_type 列,类似于“单个”或“链接”。

然后有一个单独的表与联系。在您的示例中,这实际上将包含您请求的结果集。