2017-09-25 31 views
0

私はこの情報フォームを2つのテーブルを呼び出すクエリがあります。mysqlクエリ2つのテーブルから2行

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) 

を与えますか?あなたがJOIN、例えばを使用する必要が

+0

[** SQLSTATE \ [21000 \]の重複:複数性違反:1241オペランドには1列が含まれている必要があります。 1つ以上のカラムを返すことはできません。また、1つ以上のカラムを返すことはできないことを説明しています(「sql query **」(https://stackoverflow.com/questions/38326246/sqlstate21000-cardinality-violation-1241-operand-should-contain-1-columns)。代わりに 'join'を使います。 – Nope

+0

複数の列を選択して1つの列名に割り当てようとすると、それはうまくいかず、それは意味をなさないので、それを考えるべきです...そして、mysqlエンジンはそれについて考え、例外を追加しました。そのエラーをスローします。今、JOINの使用方法を示唆している回答があるので、私たちはどのように克服するのですか?JOINを自分で使ってみてください。 –

+0

@AbhikChakraborty私の例を助けてください。 – Martinovska

答えて

2

まず、あなたの代わりに2列

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

あなたを持っている、インラインビューを作成することができませんJOINを使用する必要があります。これは、現在のアプローチよりも効率的で読みやすくなります。

+0

@サギ私は同意する。文句は間違っていると思います。 – Ravi

+0

LEFT JOIN? ? – Martinovska

+0

@Martinovskaそれは依存します。 'Left Join'は、左テーブルから共通データとデータを返します。あなたのケースでは、 'INNER JOIN'を使うべきだと思います – Ravi

2

:あなたはPrepared Statementとセカンドを使用する必要があり、すべての

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>; 
関連する問題