2

2つのmysqlテーブルUsers&Messagesがあります。ログインしたユーザーMike(user_id = 1)が送信または受信した最新のメッセージと、メッセージの送信先のmessage_id、message_text、first_nameのみを返すSQLクエリの作成を手伝ってください。から受け取りました。message_idの降順。

これまでのところ、私はクエリを持っています:-

SELECT message_id, first_name, message_text FROM tbl_users, tbl_messages 
WHERE 
(tbl_users.user_id = tbl_messages.sender_id AND tbl_messages.receiver_id = 1 
OR tbl_users.user_id = tbl_messages.receiver_id AND tbl_messages.sender_id = 1) 
GROUP BY tbl_users.first_name
ORDER BY message_id DESC

これにより、下の画像の結果が得られます。ORDERBYが無視されているようです

結果でグループ化

前もって感謝します

tbl_users

---------------------------
| user_id |  first_name   |
---------------------------
| 1       |  Mike         |
| 2       |  John         |
| 3       |  George       |
| 4       |  Peter        |
| 5       |  Sarah        |
---------------------------

tbl_messages

----------------------------------------------------------------
| message_id |  sender_id   |  receiver_id   |  message_text   |
----------------------------------------------------------------
| 1          |  2           | 1              |  Hello          |
| 2          |  3           | 1              |  How are you    |
| 3          |  1           | 5              |  Hi there       |
| 4          |  2           | 1              |  Greetings      |
| 5          |  1           | 4              |  Good day       |
| 6          |  3           | 1              |  Hi             |
| 7          |  5           | 1              |  A message      |
| 8          |  5           | 4              |  Good morning   |
| 9          |  1           | 5              |  Hello dear     |
| 10         |  1           | 3              |  Howdy          |
----------------------------------------------------------------

望ましい結果

----------------------------------------------
| message_id |  first_name  |  message_text  |
----------------------------------------------
| 10         |  George      | Howdy          |
| 9          |  Sarah       | Hello dear     |
| 5          |  Peter       | Good day       |
| 4          |  John        | Greetings      |
----------------------------------------------

データベースはこちらから入手できます

4

4 に答える 4

3

句を追加するだけでGROUP BY問題が解決する場合があります。これを試してください...

SELECT message_id, first_name, message_text FROM tbl_users, tbl_messages 
WHERE  
(tbl_users.user_id = tbl_messages.sender_id AND tbl_messages.receiver_id = 1 
OR tbl_users.user_id = tbl_messages.receiver_id AND tbl_messages.sender_id = 1) 
GROUP BY tbl_users.user_id
ORDER BY message_id DESC

更新:クエリ全体を変更する

SELECT t2.message_id, t2.first_name, t2.message_text FROM
(SELECT u.user_id, m.message_id, u.first_name, m.message_text FROM `tbl_users` u
  JOIN `tbl_messages` m ON (u.user_id = m.sender_id AND m.receiver_id = 1)
    OR (u.user_id = m.receiver_id AND m.sender_id = 1) 
  ORDER BY m.message_id DESC
) t2
GROUP BY t2.user_id
ORDER BY t2.message_id DESC

結果:

+------------+------------+--------------+
| message_id | first_name | message_text |
+------------+------------+--------------+
| 10         | George     | Howdy        |
| 9          | Sarah      | Hello dear   |
| 5          | Peter      | Good Day     |
| 4          | John       | Greetings    |
于 2012-12-05T16:40:43.990 に答える
2

GROUP BY重複排除したいフィールドの場合。この場合GROUP BY tbl_users.first_name、トリックを行う必要があります。

于 2012-12-05T16:56:40.503 に答える
0

参加することでこれを達成できるかどうかはわかりません。サブ選択クエリが役立つ場合があります。

  select a.first_name, 
         (select message_text from tbl_messages b
          where (a.user_id = b.sender_id and b.sender_id = 1)
                or (a.user_id = b.receiver_id and b.receiver_id  = 1)
          order by message_id DESC
          LIMIT 1)
   from tbl_users a;
于 2012-12-05T17:06:14.047 に答える
0

ORDERBY句にテーブル名がありません。また、テーブルでエイリアスを使用することをお勧めします。したがって、クエリは次のようになります。

/* All Mike's messages */
SELECT
  m.message_id,
  u.first_name,
  m.message_text
FROM
  tbl_users AS u,
  tbl_messages AS m
WHERE  
(
  u.user_id = m.sender_id AND 
  m.receiver_id = 1
) OR (
  u.user_id = m.receiver_id AND 
  m.sender_id = 1
)
ORDER BY
  m.message_id DESC;

ただし、送信メッセージと受信メッセージの結果を別々に取得する方がよいと思います。それで:

/* Messages sent my Mike */
SELECT
  m.message_id,
  u.first_name,
  m.message_text
FROM
  tbl_users AS u
  INNER JOIN tbl_messages AS m ON m.receiver_id = u.user_id
WHERE
  m.sender_id = 1
ORDER BY
  m.message_id DESC;

/* Messages received my Mike */
SELECT
  m.message_id,
  u.first_name,
  m.message_text
FROM
  tbl_users AS u
  INNER JOIN tbl_messages AS m ON u.user_id = m.sender_id
WHERE
  m.receiver_id = 1
ORDER BY
  m.message_id DESC;
于 2012-12-05T17:33:11.763 に答える