2016-04-07 21 views
0

私は、usersテーブル、positionsテーブル、およびassociates users_positionsテーブルを持っています。それは何か(最低限)のように見えるクエリからの結果カラムの追加

USERS 
----- 
id 

USERS_POSITIONS 
--------------- 
id 
user_id (FK) 
position_id (FK) 
calendar_date (a specific date) 

POSITIONS 
--------- 
id 
day (a day of the week) 
title 

ユーザーがcalendar_dateとともにusers_positionsテーブルに入っている、位置の日には、ゼロまたはそれ以上の位置のためにボランティア活動をすることができます。私は、ユーザーがいつでも自分のレコードを編集することができるので、ユーザーがそのポジション(チェックボックスになる)を持っているかどうかの記録と共に、ポジションをフォームに入力しています。

まず、データベースからポジションを引き出し、ユーザーがボランティアしたポジションだけを返すジョインを引き出しましたが、MySQLにはすべての位置を返し、余分な列にある何らかの余分な列をクエリから作成し、それらをボランティアのためにマークします。これで、フォームを生成するときに、これらのチェックボックスを情報でチェックしたり、チェックを外したりすることができました。

私が考えることができる唯一の方法は、その日の位置行の配列を取得するためにphpを使用し、次にユーザーがどの行をボランティアしたかを示す結合行の配列を取得することです。次に、前の段落で説明したデータを持つ新しい配列を作成するために、それらを繰り返します。

MySQLでこれを行う方法があった場合は、もちろんそれが望ましいでしょう。では、MySQLはこのようなことをすることができますか?

答えて

2

LEFT JOINを使用してください。これは、結合しているテーブルと一致しない場合でも、最初のテーブルからすべての行を返します。一致するものがない場合は、2番目のテーブルの値はNULLになり、ボランティアがあるかどうかを表示するときにテストできます。

SELECT day, title, IF(up.id IS NULL, "No", "Yes") volunteered 
FROM Positions AS p 
LEFT JOIN Users_Positions AS up ON p.id = up.position_id AND up.user_id = @user_id 
+0

「アップ」とは何ですか? – xdola

+0

これはテーブルエイリアスなので、カラムを参照するたびにフルテーブル名を書き出す必要はありません。 – Barmar

+0

'Users_Positions AS up'は、' Up'を 'Users_Positions'のエイリアスにします。 – Barmar

関連する問題