选择(从用户中选择 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
。还有组SELECT
和FROM
部分
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。