2012-11-30 4 views
3

표준 사용자 필드를 확장하기 위해 Joomla 2.5에서 사용자 프로필 플러그인을 만들고 있습니다.Joomla 사용자 및 프로필 필드를 가져 오기위한 MySQL 쿼리

문제는 MySQL 쿼리를 통해 사용자를 추가 필드와 함께 검색하는 효율적인 방법이 필요하다는 것입니다. 현재 생각할 수있는 가장 좋은 방법은 #__user_profiles 테이블을 쿼리하고 해당 데이터를 처리하여로드 할 추가 필드를 결정한 다음 각 추가 사용자 필드에 대해 #__user_profiles 테이블에 별도의 조인을 만드는 쿼리를 생성하는 것입니다.

분명히 매우 효율적이지 않으며 대규모 사용자 기반에서는 쿼리가 매우 느립니다.

다른 테이블의 개별 레코드 인 추가 사용자 필드를 하나의 쿼리로 결합하는 더 좋은 방법이 있습니까? 편집

:

나는 내가 #_ 사용자와 # _user_profiles 테이블을 결합해야하므로 모든 사용자 및 확장 필드를 잡아해야하는 외부 스크립트를

+0

확장 테이블은 어떻게 정의됩니까? –

+0

표준 사용자 필드를 확장하기 위해 기본 joomla, User-Profile 플러그인을 사용해 보셨습니까? – Toretto

+0

@OlafDietsche 표준 #__users 및 #__user_profiles 테이블을 사용하고 있습니다. – JordanW

답변

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 

이렇게하면 쉽게 추가 주문 및 필터링 할 수 있도록 모든 추가 사용자 데이터를 한 줄에 포함 할 수 있습니다.

4

이 단순히 결합되어 있습니다 두 테이블 사이

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

이렇게하면 모든 사용자 및 연결된 프로필 항목이 검색됩니다. 정말 필요한 행이나 프로필 항목에 따라 추가 where 절을 사용하여이 쿼리를 제한 할 수 있습니다. 당신이 한 행에서 사용자와 관련된 프로파일 항목을 원하는 경우에

, 당신은 내가 피벗 테이블 접근

예를 가기로 결정 결국 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 
+0

답장을 보내 주셔서 감사합니다 @OlafDietsche, 나는 첫 번째 쿼리가 작은/여분의 필드의 작은 금액과 사용자의 중간 숫자 괜찮을 것이라고 생각합니다. 불행히도 저는 20 개 이상의 추가 필드가있는 100,000 이상의 사용자를 다루고 있습니다. 두 번째 쿼리를 좋아하지만 group_concat이 단일 필드를 생성하기 때문에 필터링 및 주문 옵션이 제한됩니다. 필자는 피벗 테이블 방식을 사용하기로 결정했습니다. 위의 대답에 예제를 추가했습니다. – JordanW

관련 문제