0

/ edit ああ、すみません。私の解決策が基本的に正しいことに気づいていませんでした-私が欠けていたのは、外部クエリの2番目のORDERBYだけでした。


2つのテーブルがあります。バッジに関する情報を含むバッジテーブルと、ユーザーへのバッジの授与に関する情報を含むuser_awardテーブルです。Xの最新の賞を獲得し、ページ付けのあるアクティビティウィジェットを表示したいと思います。

重要なのは、管理者が同時に複数のユーザーにバッジを授与できるということです。これにより、ユーザーごとにテーブルuser_awardに個別のレコードが作成されますが、すべて同じ日時の値になります。私のアクティビティウィジェットでは、同じ日時の値を持つすべての賞を1つのエントリにグループ化するため、次のようになります。

  • ボブとメアリーは「FirstinLine」のバッジを受け取りました。
  • カルロスはバッジ「ナイトフクロウ」を受け取りました。
  • ハイメとオリバーは「キッチンマスター」のバッジを受け取りました
  • ニールは「AlreadyUp?」というバッジを受け取りました。
  • ブルースとシルベスターはバッジ「MortalEnemies」を受け取りました。

ご覧のとおり、最新の5つの賞のエントリだけではなく、日付ごとに最新の賞のエントリをグループ化しています。

私のスキーマの関連部分は次のとおりです。

user_award
  +---------------+--------------+------+-----+---------+----------------+
  | Field         | Type         | Null | Key | Default | Extra          |
  +---------------+--------------+------+-----+---------+----------------+
  | id            | int(11)      | NO   | PRI | NULL    | auto_increment | 
  | user_ssomail  | varchar(64)  | NO   |     | NULL    |                | 
  | badge_id      | int(11)      | NO   | MUL | NULL    |                | 
  | when          | datetime     | YES  |     | NULL    |                |
  +---------------+--------------+------+-----+---------+----------------+


badge
+-------------------------+--------------+------+-----+---------+----------------+
| Field                   | Type         | Null | Key | Default | Extra          |
+-------------------------+--------------+------+-----+---------+----------------+
| id                      | int(11)      | NO   | PRI | NULL    | auto_increment | 
| title                   | varchar(45)  | NO   |     | NULL    |                | 
| description             | text         | NO   |     | NULL    |                | 
| image                   | varchar(120) | NO   |     | NULL    |                | 
+-------------------------+--------------+------+-----+---------+----------------+

user_awardテーブルのサンプルデータ:

*************************** 13. row ***************************
 user_ssomail: aaa
     badge_id: 7
         when: 2013-01-02 18:29:16
*************************** 14. row ***************************
 user_ssomail: bbb
     badge_id: 4
         when: 2013-01-02 19:07:15
*************************** 15. row ***************************
 user_ssomail: ccc
     badge_id: 4
         when: 2013-01-02 19:07:15

私が達成したい結果は次のとおりです。

***result 1***
user_ssomails: bbb, ccc
badge_id: 4
when: 2013-01-02 19:07:15

***result 2***
user_ssomails: aaa
badge_id: 7
when: 2013-01-02 18:29:16

同じ日時のアワードはグループ化され、user_ssomailsが連結されていることに注意してください。

これまでに学んだことから、GROUP操作はSORT操作の前に行われるため、複合クエリを試しました。内部クエリはすべてのuser_awardsを選択し、日付で並べ替えます。

    SELECT badge.image,
       badge.title,
       user_award.badge_id,
       user_award.user_ssomail,
       user_award.when
FROM user_award
INNER JOIN badge ON user_award.badge_id = badge.id
ORDER BY user_award.when DESC

外部クエリは、日時フィールドごとに結果をグループ化します。

    SELECT sorted_awards.image,
       sorted_awards.title,
       sorted_awards.badge_id,
       GROUP_CONCAT(sorted_awards.user_ssomail) AS ssomails,
       sorted_awards.when
FROM
  (SELECT badge.image,
          badge.title,
          user_award.badge_id,
          user_award.user_ssomail,
          user_award.when
   FROM user_award
   INNER JOIN badge ON user_award.badge_id = badge.id
   ORDER BY user_award.when DESC) AS sorted_awards
GROUP BY sorted_awards.when LIMIT :bottom_limit,
                                  :upper_limit

しかし、これは私が望むものを返しません。私がここで間違っていることを誰かが指摘できますか?前もって感謝します。

4

1 に答える 1

0

なぜちょうどGROUP BYそしてそれからではないのORDER BYですか?はとにかくLIMIT使用されます:ORDER BY

SELECT b.image,
       b.title,
       a.badge_id,
       GROUP_CONCAT(a.user_ssomail) AS ssomails,
       a.`when`
   FROM user_award AS a
     INNER JOIN badge AS b
       ON a.badge_id = b.id
   GROUP BY a.`when`, 
            a.badge_id 
   ORDER BY a.`when` DESC
       LIMIT x OFFSET y ;
于 2013-01-03T11:46:32.607 に答える