SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.04.2012 16:42:50

lidervik
Участник
Зарегистрирован: 19.01.2012
Сообщений: 9

Впервые столкнулся с запросом, помогите, кто чем может

Доброго всем дня!

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

Есть таблица table_pm  в  ней столбцы :
user – логин написавшего
user_from – id получателя
text – само сообщение
data – дата

+---+------+----------+-------+---------+
| id |   user |user_from |  text  |   data     |
+---+------+----------+-------+---------+
| 1 | name1 |   1         |  текст | 01.01.12 |
| 2 | name2 |   3         |  текст | 02.01.12 |
| 3 | name3 |   1         |  текст | 03.01.12 |
| 4 | name4 |   3         |  текст | 04.01.12 |
| 5 | name6 |   5         |  текст | 05.01.12 |
| 6 | name2 |   3         |  текст | 05.01.12 |
+--+-------+---------+--------+---------+

Мне надо выбрать имена пользователей (user) написавших сообщение пользователю с id 3 (user_from=3), но есть одно но, имена при выборке не должны повторяться и выводится по дате последнего сообщения.

Составил следующий запрос:

$query_pm=mysql_query("SELECT id, user, user_from, text, data FROM table_pm WHERE table_pm.user_from='3' ORDER BY date DESC LIMIT 10");

При выводе в цикл получается, что строки с одинаковыми именами (user) повторяются!

Как избавится от предыдущих строк с одинаковыми именами по дате последнего сообщения?

Отредактированно lidervik (28.04.2012 17:34:08)

Неактивен

 

#2 28.04.2012 17:32:11

lidervik
Участник
Зарегистрирован: 19.01.2012
Сообщений: 9

Re: Впервые столкнулся с запросом, помогите, кто чем может

Решено!
Помогла тема: http://sqlinfo.ru/forum/viewtopic.php?id=5340

Но хотелось бы услышать мнение опытных пользователей:

$query_pm=mysql_query("SELECT * FROM (SELECT * FROM table_pm WHERE user_from='3' ORDER BY data DESC) AS table_pm GROUP BY user"); cq();

Неактивен

 

#3 28.04.2012 19:00:27

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Впервые столкнулся с запросом, помогите, кто чем может

А не проще ли SELECT `user`, max(`data`) FROM `table_pm` WHERE `user_from` = 3 GROUP BY `user`;?

Если нужно, чтобы сортировка шла по дате, то добавьте ORDER BY 1 ASC или ORDER BY 1 DESC


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 28.04.2012 21:01:10

lidervik
Участник
Зарегистрирован: 19.01.2012
Сообщений: 9

Re: Впервые столкнулся с запросом, помогите, кто чем может

deadka написал:

А не проще ли SELECT `user`, max(`data`) FROM `table_pm` WHERE `user_from` = 3 GROUP BY `user`;?

Спасибо, обязательно попробую сменить запрос!

Неактивен

 

#5 05.05.2012 17:01:20

lidervik
Участник
Зарегистрирован: 19.01.2012
Сообщений: 9

Re: Впервые столкнулся с запросом, помогите, кто чем может

Остановился на запросе из поста #2 добавил таблицу пользователей и в итоге получилось следующий запрос:

SELECT * FROM (SELECT table_pm.text, table_pm.pm_read, table_pm.status, table_pm.date, table_pm.user_from, c2.user_id AS fromid_user FROM table_pm JOIN table_users c2 ON table_pm.user_from = c2.name
WHERE user=".$data[user_id]." AND status='send' ORDER BY date DESC)
AS table_pm GROUP BY user_from
ORDER BY pm_read ASC


C этим запросом разобрался, но теперь возникла следующая ситуация:

Когда пишут мне сообщение, диалог на странице выводится, а вот когда пишу я первое сообщение любому пользователю то записей не находит и соответственно я не могу даже посмотреть, что я ему написал.
Вся сложность заключается в том, что выше изложенный запрос, после, формирует переход на всю переписку с пользователем в цикле, где выводится последнее сообщение от пользователя с которым ведется диалог (((

Посоветуйте, пожалуйста, выход из ситуации? В голову пришло такое решение: ранее проверять еще одним запросом, писал мне юзер или нет и в зависимости от того применять соответствующий запрос, но тогда нарушается вывод по последней дате, если есть диалоги в которых писали мне и в которых писал только я (тем кому я писал будут идти после тех, которые писали мне или наоборот, а мне это не подходит)? Может кто знает вариант попроще ?

Отредактированно lidervik (05.05.2012 17:24:54)

Неактивен

 

#6 07.05.2012 15:46:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Впервые столкнулся с запросом, помогите, кто чем может

1. Скажите, есть ли какой-то сакральный смысл в том, чтобы делать подзапросом с последующей
группировкой? Может, просто утащить группировку внутрь (заодно избавившись от лишней сорти-
ровки внутри?)

2. Если Вы ищете status='send', то не удивительно, что запрос не находит status='receive'?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson