啊...我一直在用头撞这个,因为我似乎想不明白。
我的表:
$ select * from my_family_members;
+-----------+-----------+-----------------------------+
| member_id | house_id | member_name |
+-----------+-----------+-----------------------------+
| 2 | 2 | Ash |
| 5 | 5 | Mel |
| 8 | 2 | NULL |
+-----------+-----------+-----------------------------+
$ select * from my_houses;
+------------------------------------------+
| house_id | code | house_name |
+------------------------------------------+
| 2 | house1 | My Blue house |
| 5 | house2 | My Red house |
| 8 | house3 | My Green house |
| 9 | house4 | My Pink House |
+------------------------------------------+
$ select * from my_pets;
+-----------+--------------+----------------+
|house_id | config_key | config_value |
+-----------+--------------+----------------+
| 2 | cat | Tom |
| 2 | cat | Jerry |
| 5 | dog | Buster |
| 8 | cat | Bubbles |
+-----------+--------------+----------------+
我尝试做一个查询,将得到我的house_id,member_id和config_value的猫,包括NULL值。即:
+---------------+------------------------------+
| house_name | member_name | cats |
+---------------+------------------------------+
| My Blue House | Ash | Jerry |
| My Blue House | Ash | Tom |
| My Red House | Mel | NULL |
| My Green House| NULL | Bubbles |
| My Pink House | NULL | NULL |
+---------------+------------------------------+
我尝试了一个类似的查询:
select mh.house_name, mfm.member_name, config_value as cats
from my_pets mp
LEFT OUTER JOIN my_houses mh
ON mp.house_id=mh.house_id
JOIN my_family_members mfm
ON mfm.house_id=mh.house_id
where config_key = 'cat' order by house_name;
但我只能得到:
+---------------+------------------------------+
| house_name | member_name | cats |
+---------------+------------------------------+
| My Blue House | Ash | Jerry |
| My Blue House | Ash | Tom |
+---------------+------------------------------+
我需要改变什么才能得到我想要的结果?
编辑:逻辑是总有一所房子,但房子可以有一只猫,而实际上没有人住在里面,所以member_name是NULL,cat不是NULL(可怜的猫。.),也可以有一个成员没有猫的房子(cat是NULL,但member不是NULL),最后也可以有一个房子没有人,也没有猫(cat是NULL,member_name是NULL,虽然可能有狗,但我只想看看房子里是否有猫或人)。
进一步编辑:我在这里有一个严重的错误,当我把我的实际问题翻译成一个假设的问题时。我意识到在my_pets表中,它实际上有house_id列,而不是member_id列。抱歉造成了混乱。.....我已经更正了上面的数据集。
谢谢!
1条答案
按热度按时间nmpmafwu1#
你似乎从错误的方向来处理这个问题。你想要所有的房子,所以从那个表开始(my_houses)。然后,你希望每个房子都有人居住-不排除没有人的房子-所以左加入人(我的家庭成员)到房子。然后你想要任何存在的宠物-不排除房子/人-所以左加入宠物(my_pets)到人。
比如说
第二个答案
我假设成员8的名字为空是一个错字,因为一个人必须有一个名字?希望这能给你你想要的。如果没有,那么您可能需要考虑结束这个问题,花一些时间来思考您想要实现的目标,然后创建一个新问题,准确描述表结构、所有可能的场景和您想要的结果