2017-09-25 162 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>;