【问题标题】:Order MySql query using订购 MySql 查询使用
【发布时间】:2013-01-17 11:08:27
【问题描述】:

我,我想查询并以特殊方式对我的成员进行排序...有人可以帮忙吗? 这就是问题所在。 我想使用特殊的排序顺序在我的表中选择成员。 配置文件字段值存储在 wp_bp_xprofile_data 表中,如下所示:

   id   | field_id | user_id |     value
--------+----------+---------+----------

例如,我有 3 个字段

  • NICKNAME (field_id = 1)
  • FIRSTNAME (field_id = 2)
  • 姓氏(field_id = 3)

表格行将如下所示:

   id   | field_id | user_id |     value
--------+----------+---------+----------
  2544       1          100       fib
  2545       2          100       john
  2546       3          100       arenzich

  2547       1          200       dog
  2548       2          200       rick
  2549       3          200       zarenburg

  2550       1          300       fox
  2551       2          300       frank
  2552       3          300       arenzich

我有这个查询来使用一个字段对它们进行排序,例如按昵称按字母顺序对它们进行排序:

SELECT *
FROM wp_bp_xprofile_data u WHERE u.field_id = 1 ORDER BY u.value ASC

所以它们将像这样排序:dog(200),fib(100),然后是 fox(300)。 现在,我想对它们进行排序,而不是一个,而是几个字段(名字和姓氏;以区分具有相同姓氏的人),以便查询按此顺序返回用户:

frank arenzich (300)、john arenzich (100)、frank arenzich (200)。

有什么想法吗?

非常感谢!!!

【问题讨论】:

  • 你的意思是rick zarenburg (200)

标签: mysql


【解决方案1】:

这可能需要首先按列将其转换为适当的表,然后在多个列上对其进行排序。 注意:这不会以与原始表格相同的格式生成输出,但可以说更加灵活和有用,因为它将每个 user_id 的所有信息组合到一行中。

/* A column-wise pivot of NICKNAME, FIRSTNAME, LASTNAME */
SELECT
  user_id,
  MAX(CASE WHEN field_id = 1 THEN value ELSE null END) AS NICKNAME,
  MAX(CASE WHEN field_id = 2 THEN value ELSE null END) AS FIRSTNAME,
  MAX(CASE WHEN field_id = 3 THEN value ELSE null END) AS LASTNAME
FROM wp_bp_xprofile_data
GROUP BY user_id
/* Include the HAVING if you only want those who have both first & last names specified */
HAVING 
  FIRSTNAME IS NOT NULL 
  AND LASTNAME IS NOT NULL
/* Pivoted columns can then be treated in the ORDER BY */
ORDER BY 
  FIRSTNAME,
  LASTNAME

Here is a demonstration...

看起来这是一个 Wordpress 表格,因此您可能无法更改其结构。但是,如果您确实可以选择修改它,我建议您将结构更改为类似于枢轴的输出。

【讨论】:

  • 这太棒了!!!非常感谢 !!!两个 cmets : 1/ 实际上,我只需要获取 user_id 字段。您的解决方案(“模拟”字段)可以兼容吗?所以我只需要从 2 中选择用户 ID/我想忽略没有设置这些字段的用户。将名字为“bill”的用户排在名字为“frank aremberg”的用户之前会很烦人(因为我们首先使用姓氏进行排序)。有什么想法吗?
  • @user782013 您想在排序中忽略它们,或者如果它们没有设置两个字段,则从输出中一起过滤?
  • @user782013 我添加了一个HAVING 子句,如果你想过滤那些没有第一个和最后一个的子句。如果您不想过滤,而是以不同的方式排序,那么这是一个不同的过程。
  • 看来这很完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多