一个查询中有多个mysql'select from'

一个查询中有多个mysql'select from'

选择(从用户中选择 user_id,其中 user_id=1)作为 user_id,(从用户设置中选择 usersetting_user_id,其中 usersetting_user_id=1)作为 usersetting_user_id;

返回:

| user_id | usersetting_user_id |  
|       1 |                   1 |

但我想显示所有用户,而不只是一个。因此我运行以下命令:

选择(从用户中选择 user_id)作为 user_id,(从用户设置中选择 usersetting_user_id)作为 usersetting_user_id;``

并得到:

ERROR 1242 (21000): Subquery returns more than 1 row

知道如何避免这种情况吗?

答案1

您应该使用join如下语句:

SELECT u.user_id, us.usersetting_user_id
FROM users u
JOIN usersettings us ON u.user_id = us.usersetting_user_id

假设 usersettings.usersetting_user_id 是对用户主键 (user_id) 的引用。具体信息可参见在手册中

答案2

FROM在子句中分配别名,然后使用alias.fieldname。还有组SELECTFROM部分

SELECT user_id.user_id, usersetting_user_id.usersetting_user_id
FROM users AS user_id, usersettings AS usersetting_user_id;

答案3

我不建议在查询中使用此类连接或多个表单,因为您完全加载所有表然后对其进行过滤。这就像使用 Having 而不是 Where。它与 mysql-server 版本相关,但您可以自己将其与 EXPLAIN(或 EXPLAIN EXTENDED)进行比较。

对于您的情况,我建议您在 from 指令中使用一个表(例如基本表、用户),并使用 Where id=user_id 的内部查询加载其他数据。

# query with basic table only
SELECT
  user_id
FROM users AS u;
# extended query
SELECT
  user_id,
  (SELECT usersetting_user_id
    FROM usersettings
    WHERE usersetting_user_id = u.user_id) AS usersetting_user_id
FROM users AS u;

附言:如果您知道您的表具有相同的行数,您可以使用 Tzarium 的 Join 解决方案,但使用 INNER/LEFT/RIGHT JOIN 而不是 JOIN 或 OUTER JOIN。

相关内容