2012-11-30 41 views
3

我在Joomla 2.5中创建用户个人资料插件以扩展标准用户字段。MySQL查询获取Joomla用户及其个人资料字段

问题是我需要一个有效的方式来通过MySQL查询检索用户(以及额外的字段)。目前我能想到的最好的方法是查询#__user_profiles表并处理该数据以确定要加载的额外字段,然后生成一个查询,以在每个额外用户字段的#__user_profiles表上创建一个单独的联接。

很明显,这不是非常有效,而且对于大用户群来说,查询速度很慢。

有没有更好的方法将另一个表中单独记录的额外用户字段组合成一个查询?

编辑:

我有一个需要抓住所有的用户和他们的扩展字段,所以我需要的#_ 用户和# _user_profiles表结合外部脚本

+0

你的扩展表是如何定义的? –

+0

您是否尝试过使用默认joomla用户配置文件插件来扩展标准用户字段 – 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,我认为第一个查询对于少量额外字段的中小用户来说可以。不幸的是,我正在处理100,000多个超过20个以上字段的用户。我喜欢第二个查询,但由于group_concat创建了一个字段,所以它限制了我的过滤和排序选项。我决定采用数据透视表方法,我在上面的答案中添加了一个示例。 – JordanW

相关问题