2017-02-07 1 views
2

Мне нужно разработать приложение чата в php, для этого я создал две таблицы, которым нравятся пользователи и сообщения. каждая информация пользователя будет сохранена в таблице пользователей, и каждое сообщение будет сохранено в таблице сообщений. Я сделал часть сохранения, она работает нормально. Теперь мне нужно отображать сообщения. Так что согласно моему требованию.Проблема с порядком и группой с помощью двух внешних ключей в одной таблице

Когда какой-либо пользователь входит в свой портал, он сможет увидеть список последних посланных пользователей. И если он хочет сообщить кому-либо из других пользователей, он просто нажмет на него профиль pic, чем откроется панель сообщений. До сих пор я все закончил.

Но мой вопрос мне нужно отобразить

  • последний список пользователей обменивались сообщениями,

  • в этом мне нужно, чтобы показать пользователю имя, фотографию, последнее сообщение, дата последнего сообщения.

  • И еще одно условие - мне нужно сначала отобразить список, как и последний посланный пользователь.

Я пытался разными способами, но я получил список пользователей с первым сообщением я не хочу, так что мне нужно последнее сообщение для этого пользователя

Моих таблиц

таблицы пользователей

uid | firstname | email   | mobile 
--------------------------------------------- 
1 | kumar  | [email protected] |
---------------------------------------------- 
2 | jack  | [email protected] | 8876543216 
---------------------------------------------- 
3 | rams  | [email protected] | 7876543215 
---------------------------------------------- 
4 | devid  | [email protected] | 9876543220 
---------------------------------------------- 
5 | joe  | [email protected] | 8876543212 
---------------------------------------------- 

сообщений столик

mid| from_id | to_id | message   | created_at 
---------------------------------------------------------------- 
1 | 1  | 2 | hello jack  | 2017-02-03 09:00:52 
---------------------------------------------------------------- 
2 | 2  | 1 | hi kumar   | 2017-02-03 09:10:30 
---------------------------------------------------------------- 
3 | 2  | 3 | ram where are you | 2017-02-03 09:15:02 
---------------------------------------------------------------- 
4 | 3  | 2 | at home   | 2017-02-03 09:35:20 
---------------------------------------------------------------- 
5 | 1  | 2 | hello how are you | 2017-02-03 09:42:55 
---------------------------------------------------------------- 
6 | 4  | 2 | good morning  | 2017-02-03 09:50:45 
---------------------------------------------------------------- 
8 | 1  | 3 | hi    | 2017-02-03 09:54:22 
---------------------------------------------------------------- 
7 | 3  | 1 | hello kumar  | 2017-02-03 09:58:38 
---------------------------------------------------------------- 

Например я вошли в систему Кумар (UID = 1)

Ожидаемый результат:

firstname | message   | mid | uid 
----------------------------------------- 
rams  | hello kumar   | 7 | 3 
----------------------------------------- 
jack  | hello how are you | 5 | 2 
----------------------------------------- 

Я попытался, как это:

SELECT DISTINCT 
`u`.`firstname`, 
`u`.`profile_photo`, 
`u`.`uid`, 
`u2`.`firstname`, 
`u2`.`profile_photo`, 
`u2`.`uid`, 
`message`, 
`messages`.`created_at`, 
`messages`.`from_id`, 
`messages`.`to_id`, 
`messages`.`mid` 
FROM 
`messages` 
INNER JOIN 
`users` AS `u` ON `u`.`uid` = `messages`.`from_id` 
INNER JOIN 
`users` AS `u2` ON `u2`.`uid` = `messages`.`to_id` 
WHERE 
(from_id = 1 OR to_id = 1) 
GROUP BY 
`u`.`uid`, 
`u2`.`uid` 
ORDER BY 
`messages`.`mid` DESC 

Но есть выход, как этот

firstname | message   | mid | uid 
----------------------------------------- 
jack  | hello jack  | 1 | 2 
----------------------------------------- 
rams  | hi    | 5 | 2 
----------------------------------------- 

Заранее благодарна

+0

Вы должны делать отдельные запросы для сообщений от пользователя и к пользователю, затем объедините их с UNION. – Barmar

+0

Есть сотни вопросов о написании запросов для поиска разговоров. По какой-то причине вы не первый человек, пытающийся добавить обмен сообщениями на свой веб-сайт. – Barmar

+0

Вы можете отправить любую ссылку ссылки @Barmar –

ответ

1

попробовать этот путь

SELECT DISTINCT `u`.`firstname`,`u`.`profile_photo`, `u`.`uid`, `u2`.`firstname`,`u2`.`profile_photo`,`u2`.`uid`, `message`,`messages`.`created_at`, `messages`.`from_id`,`messages`.`to_id`,`messages`.`mid` 
FROM `messages` 
INNER JOIN `users` AS `u` ON `u`.`uid` = `messages`.`from_id` 
INNER JOIN `users` AS `u2` ON `u2`.`uid` = `messages`.`to_id` 
WHERE (from_id = 1 OR to_id = 1) 
GROUP BY `u`.`uid`, `u2`.`uid` 
ORDER BY `messages`.`created_at` DESC 
+0

Благодарим за обновление. Я пробовал это, но тот же вопрос. –

+0

. Я обновил свой ответ, а не сортировал его по середине. Вы можете использовать столбец created_at, потому что я могу видеть в вашем примере последние два столбца mid = 7 и mid = 8 не отсортированы по середине, но отсортированы по created_at column' – mandar

+0

В чем разница между его запросом и этим? У вас есть несогласованные круглые скобки в предложении 'WHERE'. – Barmar

0

Похоже, что вы хотите, чтобы помещать сообщения в той же группе, если они между теми же двумя пользователями, независимо от направления. Чтобы сделать это, измените GROUP BY на:

GROUP BY GREATEST(u.uid, u2.uid), LEAST(u.uid, u2.uid) 

Используйте это наряду с решениями в SQL Select only rows with Max Value on a Column, чтобы получить первое или последнее сообщение в каждом разговоре найденного с помощью этой группировки.

Вы должны также предоставить псевдонимы колонкам от u и u2 в предложении SELECT, чтобы вы могли отличить информацию отправителя и получателя в результате.

SELECT u.firstname AS sender_name, u.profile_photo AS sender_photo, ... 

Или так один из пользователей всегда Кумар, вы можете просто выбрать только информацию о другом пользователе:

SELECT IF(from_id = 1, u2.firstname, u1.firstname) AS firstname, 
     IF(from_id = 1, u2.profile_photo, u1.profile_photo) AS profile_photo, 
     ... 
+0

Спасибо за обновление, но я получил только первые сообщения –

+0

GROUP BY GREATEST (u.uid, u2.uid), LEAST (u.uid, u2.uid) здесь нам не нужно заказывать по uid, нам нужен заказ к середине –

+0

упорядочение и группировка - это отдельные операции – Barmar

Смежные вопросы