ここで、3 つのデータベース テーブルからデータを取得しようとして苦労しています。
アイデアは、ユーザーがいくつかのフィールドでプロファイルを入力できるということです。私はすべてのプロファイル フィールド、フィールド値、およびユーザーが選択した値を別々のテーブルに保存しています。
テーブルの構造は次のようになります。
Table 'profile_fields'
- id
- name
- sort
- status (enum '0', '1')
Table 'profile_field_values'
- id
- profile_field_id
- name
Table 'user_profile_fields'
- user_id
- profile_field_id
- profile_field_value_id
このクエリの作成方法と、JOIN を使用した理由を教えていただければ幸いです。
また、ユーザーベースが拡大した場合、このテーブル レイアウトはどのように拡張されますか?
よろしくお願いします!
編集:OK、「user_profile_fields」からユーザーが選択したオプションとともに、「profile_fields」からすべてのフィールドを返すようにする方法がまだわかりません。ユーザーが値を選択していない場合は、null にする必要があります。
これまでのところ、これは私の(機能しない)クエリです:
SELECT PF.id AS field_id, PF.name AS field_name, UPF.profile_field_value_id AS value_id, PF.type, PFV.name
FROM profile_fields PF
LEFT JOIN profile_fields_values PFV ON PFV.profile_field_id = PF.id
LEFT JOIN user_profile_fields UPF ON UPF.user_id=1 AND PF.id = UPF.profile_field_id
WHERE length(PF.name) > 0 and PF.status = '1'
ORDER BY PF.sort
このクエリは機能しているように見えますが、「profile_field_values」から値の名前をフェッチしません。
SELECT PF.id AS field_id, PF.name AS field_name, UPF.profile_field_value_id AS value_id, PF.type
FROM profile_fields PF
LEFT JOIN user_profile_fields UPF ON UPF.user_id =1
AND PF.id = UPF.profile_field_id
WHERE LENGTH( PF.name ) >0
AND PF.status = '1'
ORDER BY PF.sort