@vovaricofun
Программист - самоучка

Как сделать правильную выборку?

Добрый день.

Подскажите пожалуйста как сделать правильную выборку для вывода всех диалогов пользователя.

Существует три таблицы:
  • conversation: таблица всех диалогов
  • conversation_mem: информация о том, в каком диалоге(c_id) состоит пользователь(user)
  • user_profile: таблица пользователей
49bb0448318245dbae0c2692f4c3e54d.PNG

Раньше в одном диалоге состояли ровно 2 пользователя, поэтому таблицы conversation_mem не было вовсе, а таблица conversation: имела поля: user1 и user2. Выборка делалась так:
SELECT U.id, U.name, U.lastname, U.lastact, C.c_id
FROM user_profile U, conversation C
WHERE
CASE
   WHEN   C.user1 = '$my_id'
   THEN    C.user2 = U.id
   WHEN   C.user2 = '$my_id'
   THEN    C.user1 = U.id
END
AND (   C.user1 = '$my_id' OR C.user2 = '$my_id'   										)
ORDER BY C.time DESC


Теперь необходимо все по той же переменной $my_id:
  1. узнать все с_id, где user равен $my_id
  2. узнать все user, где с_id равен найденным в шаге 1
  3. и достать необходимые поля из user_profile, где id равен найденным id в поле user в шаге 2


Хочу сделать как и раньше все в одном запросе, понимаю что сам запрос нужно усложнить, но не знаю как. Буду благодарен за оказанную помощь.
  • Вопрос задан
  • 222 просмотра
Решения вопроса 2
w999d
@w999d
Web-developer
SELECT * FROM conversation 
INNER JOIN conversation_mem ON (conversation_mem.c_id = conversation.id) 
WHERE conversation_mem.user = $my_id 
ORDER BY conversation_mem.time DESC


ну и если нужны пользователи сразу

SELECT user_profile.* FROM conversation 
INNER JOIN conversation_mem m1 ON (m1.c_id = conversation.id) 
INNER JOIN conversation_mem m2 ON (m2.c_id = conversation.id) 
INNER JOIN user_profile ON (m2.user = user_profile.id) 
WHERE m1.user = $my_id 
ORDER BY conversation_mem.time DESC

* можно убрать conversation, если данные оттуда не нужны
SELECT user_profile.* FROM conversation_mem m1 
INNER JOIN conversation_mem m2 ON (m1.c_id = m2.c_id) 
INNER JOIN user_profile ON (m2.user = user_profile.id) 
WHERE m1.user = $my_id 
ORDER BY conversation_mem.time DESC

и если убрать себя из собеседников
WHERE ... AND m2.user <> $my_id
Ответ написан
Hakkunamatata
@Hakkunamatata
Зефирный-человек
SELECT
	cvr.`c_id`      AS "c_id",
	usr.`id`        AS "id",
	usr.`name`      AS "name",
	usr.`lastname`  AS "lastname",
	usr.`lastact`   AS "lastact"

FROM 
	`conversation_mem` cvr_m
	LEFT JOIN `conversation` cvr ON cvr.`c_id` = cvr_m.`c_id`
	LEFT JOIN `user_profile` usr ON usr.`id` = cvr_m.`user`
	
WHERE
	cvr_m.`user` = '$my_id'
	
GROUP BY
	cvr.`c_id`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы