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

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 。 还分组SELECTFROM部分

 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。