1

私は、クエリを作成し、メンバーを特別な方法で並べ替えたいと思っています...誰か助けてくれませんか? これが問題です。特別な並べ替え順序を使用して、テーブル内のメンバーを選択したいと考えています。プロファイル フィールドの値は、次のように wp_bp_xprofile_data テーブルに格納されます。

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

たとえば、3つのフィールドがあります

  • ニックネーム (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

たとえば、ニックネームでアルファベット順に並べ替えるなど、1 つのフィールドを使用してそれらを並べ替えるには、次のクエリを使用します。

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

つまり、dog(200)、fib(100)、次に fox(300) のようにソートされます。ここで、クエリが次の順序でユーザーを返すように、1 つではなく複数のフィールド (名と姓、同じ姓を持つ人を区別するため) を並べ替えたいと思います。

フランク・アレツィヒ (300)、ジョン・アレツィヒ (100)、フランク・アレツィヒ (200)。

これを行うためのアイデアはありますか?

どうもありがとう !!!

4

1 に答える 1

2

これはおそらく、最初にこれを列ごとに適切なテーブルにピボットし、次にそれを複数の列で並べ替える必要があります。注: これにより、元のテーブルと同じ形式で出力が生成されるわけではありませんが、それぞれのすべての情報user_idが 1 行にまとめられるため、より柔軟で便利です。

/* 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

これがデモンストレーションです...

これは Wordpress のテーブルのように見えるため、その構造を変更する立場にない可能性があります。ただし、変更するオプションがある場合は、構造をピボットの出力に似たものに変更することをお勧めします。

于 2013-02-02T03:02:57.273 に答える