3

標準のユーザー フィールドを拡張するために、Joomla 2.5 でユーザー プロファイル プラグインを作成しています。

問題は、MySQL クエリを介して (追加のフィールドと共に) ユーザーを取得する効率的な方法が必要なことです。現在考えられる最善の方法は、 #__user_profiles テーブルにクエリを実行し、そのデータを処理してロードする追加フ​​ィールドを決定し、追加のユーザー フィールドごとに #__user_profiles テーブルに個別の結合を作成するクエリを作成することです。

明らかに、これはあまり効率的ではなく、大規模なユーザー ベースではクエリが非常に遅くなります。

別のテーブルの個別のレコードである追加のユーザー フィールドを 1 つのクエリに結合するより良い方法はありますか?

編集:

すべてのユーザーとその拡張フィールドを取得する必要がある外部スクリプトがあるため、 #_ users テーブルと # _user_profiles テーブルを組み合わせる必要があります

4

2 に答える 2

4

これは単に2つのテーブル間の結合です

select u.*, p.*
from #__users u
left join #__user_profiles p on p.user_id = u.id

これにより、すべてのユーザーおよび関連するプロファイルエントリが取得されます。本当に必要な行またはプロファイルエントリに応じて、追加のwhere句を使用してこのクエリを制限できます。

ユーザーと関連するプロファイルエントリを1つの行にまとめたい場合は、プロファイルエントリを次のように組み合わせることができます。group_concat

select u.*, group_concat(p.profile_key, '=', p.profile_value)
from #__users u
left join #__user_profiles p on p.user_id = u.id
group by u.id
于 2012-11-30T20:59:50.920 に答える
3

結局、私はピボットテーブルアプローチに行くことにしました

例:

SELECT
    #__users.*,
    MAX(CASE WHEN profile_key = "example.firstname" THEN profile_value END) AS FirstName,
    MAX(CASE WHEN profile_key = "example.lastname" THEN profile_value END) AS LastName,
    MAX(CASE WHEN profile_key = "example.company" THEN profile_value END) AS Company
FROM #__users LEFT JOIN #__user_profiles ON #__users.id = #__user_profiles.user_id
GROUP BY #__users.id

これにより、すべての追加ユーザーデータを1行にまとめることができるため、簡単に注文してフィルタリングできます。

于 2012-12-07T10:30:22.690 に答える