【问题标题】:Selecting rows where value don't exist in other table选择其他表中不存在值的行
【发布时间】:2013-08-21 13:01:47
【问题描述】:

我有两张桌子。一个是主号,一个是封禁号,我想选择主号中的所有成员,只选择未被封禁的成员。

SELECT Username, $field AS Output
FROM `Player_Accounts`, `Ban_List`
WHERE Ban_List.Banned_Name != Username
ORDER BY $field DESC LIMIT 0, 25;

查询需要 1,30 分钟才能执行并显示结果

【问题讨论】:

  • 我假设您使用的是mysql_*,所以我会告诉您,mysql_* 函数不再支持,它们是officially deprecated不再维护,将来会是removed。您应该使用PDOMySQLi 更新您的代码,以确保您的项目在未来的功能。
  • 除了您在下面看到的任何查询之外,请确保将 Banned_Name 和 Username 都编入索引。

标签: php mysqli phpmyadmin


【解决方案1】:

恕我直言,您的查询不正确。行数非常多(你有 130 万用户吗???)

试试这个:

SELECT p.username
FROM Player_Accounts p
WHERE NOT EXISTS(
    SELECT 'BANNED'
    FROM Ban_List b
    WHERE b.banned_name = p.username
)

替代方案:

SELECT p.username
FROM Player_Accounts p
LEFT OUTER JOIN Ban_List b
ON p.username = b.banned_name
WHERE b.banned_name IS NULL

【讨论】:

  • LEFT JOIN 不是替代方案,而是唯一的解决方案(至少对于 mysql 而言)。
  • 不幸的是它不起作用。 SELECT p.Username, p.Pocket_Money FROM Player_Accounts p LEFT OUTER JOIN Ban_List b ON p.Username = b.Banned_Name WHERE b.Banned_Name 为 NULL ORDER BY p.Pocket_Money DESC LIMIT 0, 25;显示第 0 - 24 行(总共 25 行,查询耗时 103.6118 秒) Ban_List = 总共 1,583 行 Player_Accounts = 总共 6,154
猜你喜欢
  • 2013-10-22
  • 2020-06-08
  • 1970-01-01
  • 2019-07-08
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多