gpt4 book ai didi

mysql - MySQL数据库中的关系表

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:45 24 4
gpt4 key购买 nike

我正在努力加深对 MySQL 的了解,以及数据库中几个不同表之间的关系如何发挥作用。我了解主键和外键以及它们在表中的工作方式。

我所拥有的是一个我正在玩的测试数据库,里面装满了peoplehats 以及不同帽子和人之间的关系。到目前为止,这是我的测试数据库中的内容:

| Tables_in_test  |
+-----------------+
| hats |
| hats_collection |
| people |
+-----------------+

我的people 表如下所示:

+-----------+---------+
| person_id | fname |
+-----------+---------+
| 1 | Sethen |
| 2 | Michael |
| 3 | Jazmine |
+-----------+---------+

我的 hats 表如下所示:

+--------+----------+
| hat_id | hat |
+--------+----------+
| 1 | Awesome |
| 2 | Kick Ass |
| 3 | Bowler |
| 4 | Fedora |
+--------+----------+

最后,我的 hats_collection 表如下所示:

+-----------+--------+
| person_id | hat_id |
+-----------+--------+
| 2 | 1 |
| 2 | 4 |
| 3 | 2 |
+-----------+--------+

本质上,我将所有可能存在于 hats 表中的不同帽子存储起来,并将它们与不同人的关系保存在 hats_collection 表中,该表仅使用 person_idhat_id

虽然我确定如何正确设置所有这些表并插入数据,但我不确定如何编写查询来显示 hats_collection 表中的数据以显示用户名以及他们戴的是哪顶帽子。

这是我目前所拥有的:

SELECT people.fname, hats.hat
FROM people
INNER JOIN hats
INNER JOIN hats_collection
ON hats_collection.person_id = people.person_id AND hats_collection.hat_id = hats.hat_id
WHERE people.person_id = 1;

它返回一个空集。

我的问题是:

  1. 如何更改我的查询以获得关于哪些人有哪些帽子的正确结果?
  2. 这是我为类似的事情设置表格的方式吗?有没有更简单/更有效的方法?

编辑

抱歉,我发布的查询有效。它返回一个空集,因为 id 为 1 的人没有任何帽子,但这又产生了一个新问题:

  1. 这是编写此查询的最佳方式吗?

关于如何以最有效的方式做到这一点,我的问题仍然存在。

最佳答案

id=1 的人没有任何帽子,所以这很好。

如果你想显示人物,即使他们没有任何帽子,你必须使用 LEFT JOIN 代替

SELECT people.fname, GROUP_CONCAT(hats.hat) AS hats
FROM people
LEFT JOIN hats_collection ON hats_collection.person_id = people.person_id
LEFT JOIN hats ON hats_collection.hat_id = hats.hat_id
GROUP BY people.person_id;

请注意我是如何从逻辑上对连接表重新排序并将每个相关连接条件放入其自己的连接表 ON 部分。

关于mysql - MySQL数据库中的关系表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16821500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com