【问题标题】:Retrieving data from a database with relationships从具有关系的数据库中检索数据
【发布时间】:2018-09-20 21:13:22
【问题描述】:

我正在尝试从我的数据库中检索一些数据,我已经在数据库中建立了正确的关系,但我就是不知道要使用哪个查询。

以下是不同关系的直观表示:

我想要的是从部落战争中获取所有数据,以及从申请这些战争的用户那里获取所有用户名。

你们能帮帮我吗?

提前致谢!

【问题讨论】:

  • 旁注: 由于您的 password-column 长度只有 50 个字符,它告诉我您没有使用 password_hash() 在您之前对密码进行哈希处理存储它们。你应该这样做......
  • 使用JOINs做一些研究
  • @MagnusEriksson 我是 md5 加密密码,这是有效的。还是这是个坏主意?
  • @PatrickQ 好的,感谢您引导我朝着正确的方向前进
  • 如果您检查manual 中的md5(),它会显示:“警告不建议使用此功能来保护密码,因为此散列算法的速度很快。 " 所以是的,这是个坏主意 :-) 改用 PHP 的 password_hash()password_verify()。他们会给你一个好的和安全的密码哈希。请记住更改 password-column 的大小,因为这些哈希值更长。

标签: php sql mysqli


【解决方案1】:

怎么样:

select w.*, m.username
  from clanwars w
  join applications a on a.warid = w.id
  join members m on m.id = a.playerid

【讨论】:

  • 这回答了我的问题,但我现在意识到这不是最好的方法。还是谢谢
  • :) 一直在发生。你真正需要什么?
  • MoreFoam 提供的解决方案很好,我刚刚在之前的评论中切换了你的用户名,我还不能编辑它哈哈
  • 忠告。 @MoreFoam 的解决方案效果很好。然而,它受到“N+1”问题的困扰。我需要大量的 SQL 执行;对于可能会变慢的大量行。除此之外,还不错。
  • 那么您会建议哪种方法?过滤您提供的连接查询的输出?
【解决方案2】:

所有部落战数据:

select * from clanwars;

所有申请参加某战的用户:

select playerid from applications where warid = <war_id>;

确保将 war_id 替换为您想要从中提取 playerid 的所需战争 id。

所有申请过战争的用户:

select distinct playerid from applications;

已应用于战争的所有用户名(使用子查询):

select username from members where id in (select distinct playerid from applications);

我的 SQL 资源是 www.w3schools.com/sql/。有机会就去看看吧。

【讨论】:

  • 我不认为 OP 只想要 id。那可能没那么有用。我认为 OP 想要所有玩家信息,所以加入是最有可能的方式。
  • @MagnusEriksson 所有战队信息,只有用户名是我要找的
  • @CheapGamer - 这只会给你玩家ID,而不是用户名。加入是必经之路。
  • @MagnusEriksson 我知道,但是当使用 Morefoam 解决方案时,如果我得到属于同一战争的多行,每行都有不同的用户,这还不错,但是在显示每场战争和其各自的申请人。我想我将只使用两个查询,一个获取所有战争,一个获取所有已申请战争的用户。
  • 我是想写 The Impaler 而不是 MoreFoam,对不起
猜你喜欢
  • 2012-04-08
  • 2020-06-09
  • 2021-04-03
  • 1970-01-01
  • 2023-01-04
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多