mysql - 实现从同一查询中检索多个用户名的 sql 的最佳方法是什么?

标签 mysql sql performance

我有一个产品表,其中包含 3 列,created_user_id、updated_user_id 和 in_charge_user_id,所有这些都与我的用户表相关,我在其中存储用户的 ID 和名称。

我想构建一个高效的查询来获取相应 user_id 的名称。

到目前为止我构建的查询如下:

SELECT products.*, 
(SELECT name FROM user WHERE user_id = products.created_user_id) as created_user,
(SELECT name FROM user WHERE user_id = products.updated_user_id) as updated_user,
(SELECT name FROM user WHERE user_id = products.in_charge_user_id) as in_charge_user
 FROM products

这个查询的问题是,如果我有 30,000 条记录,我每行要多执行 3 个查询。

实现此目标的更有效方法是什么?我正在使用 mysql。

最佳答案

对于每种类型的用户 ID(创建、更新、in_charge),您将加入用户表一次:

SELECT
  products.*,
  u1.username AS created_username,
  u2.username AS updated_username,,
  u3.username AS in_charge_username,
FROM products
JOIN user u1 ON products.created_user_id = u1.user_id
JOIN user u2 ON products.updated_user_id = u2.user_id
LEFT JOIN user u3 ON products.in_charge_user_id = u3.user_id

这是获取数据的最佳实践方法。 它类似于您的带有子选择的查询,但我认为数据库可以更好地优化和利用一种更现代的方法。

重要:

您需要在两个表中的所有 user_id 字段上建立外键索引! 那么无论表中有多少行,查询都会非常快。这需要一个支持外键的引擎,比如 InnoDB

LEFT JOIN 还是 INNER JOIN

由于其他答案建议使用 LEFT JOIN,所以我不会进行左连接。 如果您在产品表中有一个用户 ID,则用户表中必须有一个链接的 user_id,除了 in_charge_user 只出现几次。否则,数据将在语义上损坏。外键确保您始终拥有链接的 user_id,并且只有在没有链接产品时才能删除 user_id。 JOIN 等同于 INNER JOIN

关于mysql - 实现从同一查询中检索多个用户名的 sql 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927004/

相关文章:

mysql - 选择 JOINed 子串

c# - SQL 字符串或二进制数据将被截断,列名

c# - 将 GroupBy DateTime 与 Entity Framework 一起使用会引发异常

mysql - 条件写在 Where 子句上好还是 ON 子句好?

php - PHP会死在网页开发世界中吗?

c++ - 优化变量值的重复赋值

Java:比 String(byte[]) 更快的替代品

MySQL 还不支持 Limit&& in/all?

mysql - 为什么我的存储过程在插入时返回 "?"或在 UTF-8 的 select 语句中返回空

Mysql复制SLAVE宕机