2017-09-25 184 views
0

我有这个查询来调用两个表的信息。mysql从两个表中查询两行

DB::get("SELECT friends. * , (SELECT `login` FROM `users` WHERE `users`.`id` = friends.`user_id`) AS `login` FROM `friends` WHERE `id_user`='" . $this->user['id'] . "' ORDER BY `id` DESC LIMIT ") 

因此,如果用户是在朋友列表显示用户名,我想获得用户名和头像。阿凡达行是avatar。 我尝试这个。

DB::get("SELECT friends. * , (SELECT `login`, `*avatar*` FROM `users` WHERE `users`.`id` = friends.`user_id`) AS `login` FROM `friends` WHERE `id_user`='" . $this->user['id'] . "' ORDER BY `id` DESC LIMIT ") 

而且给我的错误

SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s) 

哪里是错误的?

+0

在此可能的[** SQLSTATE \ [21000 \]重复中查看答案:基数违规:1241操作数应包含1列。 SQL查询**](https://stackoverflow.com/questions/38326246/sqlstate21000-cardinality-violation-1241-operand-should-contain-1-columns)解释说,你不能有超过1列返回并使用改为加入。 – Nope

+0

当你选择多个列并尝试分配一个列名称时,它永远不会工作,应该是这样,因为它没有意义,认为它...和MySQL引擎想到它,并已为此添加了一个例外,它会抛出该错误。现在我们该如何克服,因为您可以看到一些建议使用JOIN的解答,所以请尝试使用JOIN,并让我们知道是否存在问题。 –

+0

@AbhikChakraborty帮我看看我的例子。 – Martinovska

回答

2

首先,你应该使用Prepared Statement和第二,你可以不写内嵌视图,其中有两列

SELECT friends. * , (SELECT `login`, `*avatar*` FROM .. 

,而不是你应该使用JOIN,这可能比当前的方法更有效并且更具可读性。

+0

@sagi我同意。我认为,措辞是错误的。 – Ravi

+0

'LEFT JOIN'? ? – Martinovska

+0

@Martinovska这取决于。 'Left Join'将返回左表中的公共和数据。我认为,在你的情况下,你应该使用'INNER JOIN' – Ravi

2

您需要使用JOIN,如:

SELECT f.*, u.* 
FROM friends f JOIN users u ON f.user_id = u.id 
WHERE f.id_user = <your_id> 
ORDER BY id DESC LIMIT <your_limit>;