0

次のように2つのテーブルがあります。

メッセージ

+----+--------+-----------------+
| id | sender | body            |
+----+--------+-----------------+
| 11 | 4      | test msg one    |
| 12 | 4      | test msg        |
| 13 | 1      | this is test    |
| 14 | 4      | WANT TO SHOW G1 |
| 15 | 4      | WANT TO SHOW G2 |
+----+--------+-----------------+

メッセージ受信者

+----------+------------+
| receiver | message_id |
+----------+------------+
| 1        |         11 |
| 1        |         12 |
| 4        |         13 |
| 1        |         14 |
| 3        |         15 |
+----------+------------+

次のクエリを書きました

SELECT 
    `messages`.`id`,
    `messages`.`body` ,
    `messages`.`sender`, 
    MAX(`messages`.`id`) AS MID,
    IF(`messages`.`sender`>`message_receivers`.`receiver`,`CONCAT_WS`(',',`messages`.`sender`,`message_receivers`.`receiver`), 

`CONCAT_WS`(',',`message_receivers`.`receiver`,`messages`.`sender`)) AS `conc`
FROM
    `messages`
JOIN `message_receivers` ON `messages`.`id` = `message_receivers`.`message_id`
WHERE 
    `message_receivers`.`receiver` = '4' 
    OR `messages`.`sender` = '4'
GROUP BY conc

次の結果が得られます

+----+-----------------+--------+------+------+
| id | body            | sender | MID  | conc |
+----+-----------------+--------+------+------+
| 11 | test msg one    | 4      |   14 | 4,1  |
| 15 | WANT TO SHOW G2 | 4      |   15 | 4,3  |
+----+-----------------+--------+------+------+

でも私はしたい

+----+-----------------+--------+------+------+
| id | body            | sender | MID  | conc |
+----+-----------------+--------+------+------+
| 14 | WANT TO SHOW G1 | 4      |   14 | 4,1  |
| 15 | WANT TO SHOW G2 | 4      |   15 | 4,3  |
+----+-----------------+--------+------+------+

私は何をすべきか?前もって感謝します。

4

2 に答える 2

1

標準的な解決策は、次のように無相関サブクエリを使用することです。

SELECT x.* 
  FROM my_table
  JOIN 
     ( SELECT grouping_column
            , MAX(ordering_column) max_ordering_column 
         FROM my_table 
        GROUP 
           BY grouping_column
     ) y
    ON y.grouping_column = x.grouping_column
   AND y.max_ordering_column = x.ordering_column;

または、キーが複数の列で形成されている場合...

SELECT x.* 
  FROM my_table
  JOIN 
     ( SELECT grouping_column1
            , grouping_column2
            , MAX(ordering_column) max_ordering_column 
         FROM my_table 
        GROUP 
           BY grouping_column1
            , grouping_coulmn2
     ) y
    ON y.grouping_column1 = x.grouping_column1
   AND y.grouping_column2 = x.grouping_column2
   AND y.max_ordering_column = x.ordering_column;
于 2013-10-10T11:01:37.463 に答える