【问题标题】:MySQL query for getting Joomla users and their profile fields用于获取 Joomla 用户及其个人资料字段的 MySQL 查询
【发布时间】:2012-11-18 19:11:02
【问题描述】:

我正在 Joomla 2.5 中创建一个用户配置文件插件来扩展标准用户字段。

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

显然这不是很有效,而且在庞大的用户群中查询速度很慢。

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

编辑:

我有一个外部脚本需要获取所有用户及其扩展字段,因此我需要合并 #_users 和 #_user_profiles 表

【问题讨论】:

  • 你的扩展表是如何定义的?
  • 您是否尝试过默认的 joomla,用于扩展标准用户字段的 User-Profile 插件
  • @OlafDietsche 我正在使用标准的 #__users 和 #__user_profiles 表。
  • @Tornado 我的插件是以标准用户配置文件插件为模型的。但我的问题是我有一个外部脚本需要获取所有用户及其扩展字段,我想知道是否有一种有效的方法来组合 #__users 和 #__user_profiles 表。
  • 你有多少用户?从我的角度来看,如果您需要一步完成所有操作,两个表之间的连接是最快的方法。

标签: mysql joomla


【解决方案1】:

这只是两个表之间的连接

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

【讨论】:

  • 感谢您的回答@OlafDietsche,我认为对于具有少量额外字段的中小型用户来说,第一个查询会很好。不幸的是,我正在与 100,000 多个用户打交道,其中包含 20 多个额外字段。我喜欢第二个查询,但由于 group_concat 创建了一个字段,它限制了我的过滤和排序选项。我决定采用数据透视表方法,我在上面的答案中添加了一个示例。
【解决方案2】:

最后我决定采用数据透视表方法

示例:

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

这让我可以将所有额外的用户数据放在一行中,这样我就可以轻松排序和过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多