Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день уважаемые эксперты 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)
Неактивен
Да, так действительно работать не будет. Давайте я немного упрощу задачу
до запроса, в котором будет понятно, что не так:
SELECT …
FROM tablename
JOIN (SELECT … FROM othertable JOIN tablename ON (…)) subq ON (…)
По сути, Вы просто запутались в синтаксисе. Хотели написать JOIN othertable,
а написали JOIN SELECT.
Неактивен
paulus спасибо за ответ.
да действительно внешние данные таки образом недоступны.
а не могли бы вы подсказать как еще можно реализовать выборку таким образом чтобы из вот таких данных (даты указал без времени и в российском стандарте чтобы более удобочитаемо):
небольшой комментарий: 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)
Неактивен
Ну так и делайте: используйте везде левые объединения и считайте COUNT(*),
а не COUNT(id), чтобы NULL тоже считались.
Неактивен
Спасибо.
Неактивен