0

ここで、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
4

2 に答える 2

-1

単純な JOIN が機能するようです:

SELECT pf.id, pf.name, pf.sort, pf.status,
    pfv.id, pfv.profile_field_id, pfv.name,
    upf.user_id, upf.profile_field_id, upf.profile_field_value_id
FROM profile_fields pf
    INNER JOIN profile_field_values pfv 
        ON pf.id = pfv.profile_field_id
    INNER JOIN user_profile_fields upf 
        ON upf.profile_field_value_id = pfv.id AND upf.profile_field_id = pf.id

SQL 結合の視覚的な説明

これは、を使用して、各テーブルから一致するすべてのレコードを選択します。投稿を確認して、結合と結合INNER JOINの違いを確認してください。INNEROUTER

于 2013-09-21T01:26:45.400 に答える