SELECT(SELECT user_id FROM users WHERE user_id = 1)AS user_id,(SELECT usersetting_user_id FROM usersettings WHERE usersetting_user_id = 1)AS usersetting_user_id;
这返回:
| user_id | usersetting_user_id | | 1 | 1 |
但我想显示所有用户,而不仅仅是一个。 所以我运行以下:
SELECT(SELECT user_id FROM users)AS user_id,(SELECT usersetting_user_id FROM usersettings)AS usersetting_user_id;“
并得到:
ERROR 1242 (21000): Subquery returns more than 1 row
任何想法如何绕过这个?
你应该使用一个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)的引用。 细节可以在手册中find。
在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;
我不推荐在这样的连接或多个来源的查询中使用,因为你加载所有的表,然后过滤它。 这就像使用有而不是在哪里。 它与mysql-server版本有关,但是你可以将它与EXPLAIN(或者EXPLAIN EXTENDED)进行比较。
在你的情况下,我build议你在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;
Ps如果你知道你的表具有相同的行数,你可以使用Tzarium的Join方法,但是可以使用INNER / LEFT / RIGHT JOIN而不是JOIN或OUTER JOIN。