【问题标题】:fetching multiple usernames from a database从数据库中获取多个用户名
【发布时间】:2011-12-03 17:21:23
【问题描述】:

我在一个网站上有一个 cmets 部分,如果可能的话,我想精简一下,这样它对数据库的影响就不那么大了。当用户选择一个帖子时,如果它有与之关联的 cmets,它会列出这些 cmets。当 cmets 列出时,它从另一个表中获取用户名。我将用户的 id 存储在 cmets 表中,并使用该 id 从 users 表中选择记录。并显示为“用户”说:

假设我在一个帖子上有 1000 个 cmets,它将访问用户表 1000 次以获取用户名。我认为这可能是一个糟糕的设计。我想到了一些解决方案,但不知道在这种情况下会推荐什么。

我应该将用户名存储在 cmets 表中吗?

我应该将所有已经调用的用户名存储在会话数组中吗?

将所有用户名放在一个文件中,然后从该文件中调用?

还是有其他我没有想到的解决方案?

我有点困惑。我认为我通过使用评论表中的 ID 做正确的事情,然后使用它来获取用户名,但是在阅读了大约一百万篇关于使用对数据库的影响较小的帖子之后,我开始质疑自己。

哇,感谢所有有用的答案。这是表格方案,我不知道为什么我最初没有放入。

cmets 笑话表:

id | author_id | joke_id | date_created | body
---+-----------+---------+--------------+-----
1  |     3     |    2    | 2011-06-12   | this is a comment

对于用户来说:

id | user_name | password | email | date_joined | visible
---+-----------+----------+-------+-------------+---------
 3 |   booboo  | password | email | todays_date |    1

【问题讨论】:

  • 你是在使用JOIN,还是在做多个查询?
  • 最好将表格方案添加到问题中。
  • 如果你的表中有关系而不是使用 joins 不需要每次都触发一个查询,它只是一个包含所有信息的查询。
  • @JaredFarrish 当我获取用户名时,我正在执行多个 SELECT 查询
  • 您需要尽可能使用JOINs 从与当前查询相关的其他表中引入数据。

标签: php mysql


【解决方案1】:

这就是JOINs 的用途 - 这样您就可以运行单个查询并有效地从多个表中获取组合信息。例如:

SELECT comments.id, comments.content, users.name
FROM comments
JOIN users ON comments.user = users.id
WHERE comments.id in (1,2,3)

将查找 id 为 1、2 和 3 的 3 个 cmets,并获取每个评论者的用户名,并返回如下所示的行:

comments.id | comments.content  | users.name
------------+-------------------+---------
1           | "First comment."  | "Poster1"
2           | "Second comment." | "Poster2"
3           | "Third comment."  | "Poster3"

【讨论】:

    【解决方案2】:

    您是否允许多次使用同一个用户名?如果不是,那么我将使用username 字段作为users 表的PK,并将其作为FK 存储在commentstable 中。这会很好地解决你的问题。

    如果更改 users 表的 PK 问题太大,那么只需将用户名存储在 comments 部分,因为您仍然可以使用从 users 表中选择一条记录。

    【讨论】:

      【解决方案3】:

      听起来您的 cmets 表中有一个 userID 字段,但需要查找用户名,对吗?如果是这样,JOIN 将是最好的解决方案。

      类似:

      SELECT *
      FROM `comments`
      LEFT JOIN `users` ON `users`.`id` = `comments`.`userid`
      WHERE `postid`='1'
      

      要了解有关联接及其无限可能性的更多信息,请阅读here

      【讨论】:

      • 感谢您的链接。我用过 tizag.com 几次。出于某种原因,连接似乎超出了我的想象。不是我不理解它们,它们只是让我在设置查询时感到困惑。
      【解决方案4】:

      SELECT * FROM comments LEFT JOIN users ON comments.posterid = users.id

      Google for LEFT JOIN 了解更多信息 :)

      【讨论】:

        猜你喜欢
        • 2019-07-16
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 2018-06-16
        • 1970-01-01
        • 2011-06-09
        • 2013-06-17
        相关资源
        最近更新 更多