SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 28.05.2010 21:41:57

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Помогите с запросом (внешние ссылки в запросе)

Добрый день уважаемые эксперты MySQL.

Помогите разобраться почему у меня не получается (выдает ошибку).

для организации переписки между друзьями в БД MySQL создано две таблицы:

Первая - хранит переписку, где id_user - тот кто пишет/отвечает и id_friend - тому кому пишет/отвечает
CREATE TABLE user_chat(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  id_user INT(11) UNSIGNED NOT NULL,
  id_friend INT(11) UNSIGNED NOT NULL,
  `date` DATETIME NOT NULL,
  `text` TEXT NOT NULL,
  PRIMARY KEY (id))
ENGINE = MYISAM

Вторая - хранит время последнего просмотра переписки с другом
CREATE TABLE user_lastview(
  id_user INT(11) UNSIGNED NOT NULL,
  id_friend INT(11) UNSIGNED NOT NULL,
  `date` DATETIME NOT NULL,
  PRIMARY KEY (id_user, id_friend))
ENGINE = MYISAM

Вопрос:

Пытаюсь одним запросом выдернуть следующую информацию: Ид друга (как уникальное значение [чтоб вывести всех друзей с кем была переписка] [включая если друг мне написал а я ему еще ничего не писал]) и количество новых сообщений от этого друга (или 0 если не было). Новые сообщения это те которые были написаны друзьями позже момента последнего просмотра пользователем (из 2й таблицы).

Текст скрипта который я написал ниже.
Но выходит ошибка: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'SubQuery.id_friend' in 'where clause'
Подскажите может я не в том направлении думаю? или есть другой вариант реализации. Думал что коррелированные подзапросы помогут, но почему-то в Join он не видит SubQuery

Вот сам запрос: (в текст запроса передается параметр :id_user - это ид пользователя для которого производится выборка)

SELECT 
    SubQuery.id_friend,
    SubQuery1.Count
FROM
    (SELECT
         id_friend AS id_friend
     FROM
         user_chat
     WHERE
         id_user = :id_user
           
     UNION
           
     SELECT
         id_friend
     FROM
         user_chat
     WHERE
         id_friend = :id_user) AS SubQuery
               
     LEFT OUTER JOIN (SELECT
                                  t3.id_user,
                                  COUNT(t3.id) AS Count
                              FROM
                                  user_chat AS t3
                              WHERE
                                  t3.id_user = SubQuery.id_friend AND
                                  t3.id_friend = :id_user AND
                                  t3.`date` > SOME (SELECT
                                                                 t4.`date`
                                                             FROM
                                                                 user_lastview AS t4
                                                             WHERE
                                                                 t4.id_user = :id_user AND
                                                                 t4.id_friend = SubQuery1.id_friend)
                             GROUP BY
                                 t3.id_friend) AS SubQuery1
     ON SubQuery.id_friend = SubQuery1.id_user

Заранее спасибо за любую помощь.

Отредактированно Akylenok (29.05.2010 08:58:50)

Неактивен

 

#2 29.05.2010 19:59:28

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

Re: Помогите с запросом (внешние ссылки в запросе)

Да, так действительно работать не будет. Давайте я немного упрощу задачу
до запроса, в котором будет понятно, что не так:

SELECT …
FROM tablename
JOIN (SELECT … FROM othertable JOIN tablename ON (…)) subq ON (…)

По сути, Вы просто запутались в синтаксисе. Хотели написать JOIN othertable,
а написали JOIN SELECT.

Неактивен

 

#3 31.05.2010 14:50:01

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Re: Помогите с запросом (внешние ссылки в запросе)

paulus спасибо за ответ.
да действительно внешние данные таки образом недоступны.

а не могли бы вы подсказать как еще можно реализовать выборку таким образом чтобы из вот таких данных (даты указал без времени и в российском стандарте smile чтобы более удобочитаемо):

небольшой комментарий: id_user1 - тот кто пишет/отвечает
                                    id_user2 - тот кому пишет/отвечает

id     id_user1   id_user2     `date`     `text`
1     1             2               01.01.01   что-либо   // тут первый пишет второму
2     1             4               01.01.01   что-либо   // тут первый пишет четвертому
3     4             1               01.01.01   что-либо   // четвертый отвечает первому
4     2             1               02.01.01   что-либо   // второй отвечает первому
5     3             1               03.01.01   что-либо   // третий написал первому (первый еще ни разу не смотрел переписку с третим)
6     2             1               04.01.01   что-либо   // второй написал первому (первый смотрел переписку со вторым 02.01.01)

небольшой комментарий: т.к. у первого еще небыло переписки с третим,
                                    то и нет данных по дате последнего просмотра в таблице ниже.

id_user      id_friend      `date`
1              2               02.01.01
1              4               01.01.01

получить вот такой результат для первого:

небольшой комментарий: id_post - это все с кем переписывается наш первый и кто ему пишет
                                    Count_new_sms - это количество новых сообщений, которые напсаны позже последнего
                                                             просмотра переписки первым, т.е. из таблицы выше

id_post     Count_new_sms
2              1
3              1
4              0

Отредактированно Akylenok (31.05.2010 15:02:31)

Неактивен

 

#4 31.05.2010 19:46:06

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

Re: Помогите с запросом (внешние ссылки в запросе)

Ну так и делайте: используйте везде левые объединения и считайте COUNT(*),
а не COUNT(id), чтобы NULL тоже считались.

Неактивен

 

#5 01.06.2010 22:54:10

Akylenok
Участник
Зарегистрирован: 27.05.2010
Сообщений: 15

Re: Помогите с запросом (внешние ссылки в запросе)

Спасибо.

Неактивен

 

Board footer

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