我有一个产品表,其中包含 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/