Сложно описать то, что хочу получить... но попробую. Создаю проект "Рассылка", который позволяет пользователям создавать собственные рассылки, и в них публикации - и рассылать подписчикам публикации в данной рассылке.
Есть таблица sb_publications - это набор публикаций
структура:
Код
CREATE TABLE `sb_publications` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`sub_id` int(11) default NULL COMMENT 'Идентификатор рассылки',
`c_date` datetime default NULL COMMENT 'Дата создания',
`name` varchar(100) default NULL COMMENT 'Название публикации',
`content` text COMMENT 'Текст',
`status` char(1) default NULL COMMENT 'Статус',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=20 DEFAULT CHARSET=cp1251 COMMENT='Публикации';
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`sub_id` int(11) default NULL COMMENT 'Идентификатор рассылки',
`c_date` datetime default NULL COMMENT 'Дата создания',
`name` varchar(100) default NULL COMMENT 'Название публикации',
`content` text COMMENT 'Текст',
`status` char(1) default NULL COMMENT 'Статус',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=20 DEFAULT CHARSET=cp1251 COMMENT='Публикации';
Есть таблица sb_logs - это статус отправки публикаций такому-то подписчику... Записи могут быть, а могут и не быть (если еще не отправляли), или статус (status) = 0, значит - пытались отправить, но неудачно. А если статус = 1 - то успешно.
Структура:
Код
CREATE TABLE `sb_logs` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`sub_id` int(11) default NULL COMMENT 'ID рассылки',
`pub_id` int(11) default NULL COMMENT 'ID публикации',
`s_date` datetime default NULL COMMENT 'Дата отправки',
`to_email` varchar(100) default NULL COMMENT 'На какой E-mail отправлено',
`sub_member_id` int(11) default NULL COMMENT 'ID подписчика',
`status` tinyint(1) default NULL COMMENT 'статус отправки сообщения, 1 - отправлено, 0 - нет',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_id` (`pub_id`,`sub_member_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=cp1251 COMMENT='Статистика рассылок';
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`sub_id` int(11) default NULL COMMENT 'ID рассылки',
`pub_id` int(11) default NULL COMMENT 'ID публикации',
`s_date` datetime default NULL COMMENT 'Дата отправки',
`to_email` varchar(100) default NULL COMMENT 'На какой E-mail отправлено',
`sub_member_id` int(11) default NULL COMMENT 'ID подписчика',
`status` tinyint(1) default NULL COMMENT 'статус отправки сообщения, 1 - отправлено, 0 - нет',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_id` (`pub_id`,`sub_member_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=cp1251 COMMENT='Статистика рассылок';
Также есть таблица sb_subscribe_member - это подписчики. Структура:
Код
CREATE TABLE `sb_subscribe_member` (
`id` int(11) NOT NULL auto_increment,
`sub_id` int(11) default NULL COMMENT 'ID рассылки',
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`email` varchar(50) default NULL COMMENT 'E-mail подписчика',
`date` datetime default NULL,
`ip` varchar(15) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=75 DEFAULT CHARSET=cp1251 COMMENT='Подписчики';
`id` int(11) NOT NULL auto_increment,
`sub_id` int(11) default NULL COMMENT 'ID рассылки',
`user_id` int(11) default NULL COMMENT 'ID пользователя',
`email` varchar(50) default NULL COMMENT 'E-mail подписчика',
`date` datetime default NULL,
`ip` varchar(15) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=75 DEFAULT CHARSET=cp1251 COMMENT='Подписчики';
Нужно получить Список ВСЕХ публикации в данной рассылке (sp.sub_id = '19').
При чем для пользователя с E-mail 'gal@yandex.ru' (текущий) рядом с каждой публикацией поставить СТАТУС (sl.`status` as state_r). В PHP я проверяю если статус будет равен 1 - то "получена", иначе - "не получена". При объединении таблиц получается, что статус может быть NULL, т.е. публикация еще не рассылалась данному подписчику... или 0 - тогда тож (не отправлено).
Типа запрос:
Код
SELECT sp.id, sp.name, sp.`status`,
sp.c_date,
sl.`status` as state_r
FROM sb_publications sp
LEFT JOIN sb_logs sl
ON sl.sub_id = sp.sub_id
INNER JOIN sb_subscribe_member sm
ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.status = '3' AND sl.to_email = 'gal@yandex.ru'
ORDER BY sp.c_date DESC, sp.id DESC
sp.c_date,
sl.`status` as state_r
FROM sb_publications sp
LEFT JOIN sb_logs sl
ON sl.sub_id = sp.sub_id
INNER JOIN sb_subscribe_member sm
ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.status = '3' AND sl.to_email = 'gal@yandex.ru'
ORDER BY sp.c_date DESC, sp.id DESC
Результат дает не верный - выбирает записи более одного раза (повторяются), либо статус = '1' всегда

ПОМОЖИТЕ ПЛИЗ!!! А то я точно в отпуск седня не уйду...................
И в условие sl.to_email = 'gal@yandex.ru' запихиваить тож по-моему не правильно... т.к. он конкретно привяжется к этой таблице, и если пользователя с данным E-mail не будет - то он вообще не покажет данную публикацию...

Спустя 1 час, 32 минуты, 24 секунды (14.07.2008 - 09:29) Ghost написал(а):
не LEFT JOIN, а RIGHT нужен
Спустя 27 минут, 52 секунды (14.07.2008 - 09:57) Sylex написал(а):
Цитата(Ghost @ 14.7.2008, 13:29) [snapback]43383[/snapback]
не LEFT JOIN, а RIGHT нужен
Подписчик:
Код
INSERT INTO sb_subscribe_member
(`id`, `sub_id`, `user_id`, `email`, `date`, `ip`)
VALUES
(51, 19, 11, 'gal@yandex.ru', "9.7.2008 17:48:27", '127.0.0.1');
(`id`, `sub_id`, `user_id`, `email`, `date`, `ip`)
VALUES
(51, 19, 11, 'gal@yandex.ru', "9.7.2008 17:48:27", '127.0.0.1');
Публикации:
Код
INSERT INTO sb_publications
(`id`, `user_id`, `sub_id`, `c_date`, `name`, `content`, `status`)
VALUES
(10, 14, 19, "8.7.2008 17:30:56", 'вапыпвапыпвапыпвапып', 'ывпывапывапывапываапывапывапыавп ывпывапывапывапыавп', '3');
INSERT INTO sb_publications
(`id`, `user_id`, `sub_id`, `c_date`, `name`, `content`, `status`)
VALUES
(19, 14, 19, "14.7.2008 11:18:27", 'Для использования визуального', 'Для использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!', '3');
(`id`, `user_id`, `sub_id`, `c_date`, `name`, `content`, `status`)
VALUES
(10, 14, 19, "8.7.2008 17:30:56", 'вапыпвапыпвапыпвапып', 'ывпывапывапывапываапывапывапыавп ывпывапывапывапыавп', '3');
INSERT INTO sb_publications
(`id`, `user_id`, `sub_id`, `c_date`, `name`, `content`, `status`)
VALUES
(19, 14, 19, "14.7.2008 11:18:27", 'Для использования визуального', 'Для использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!\r\n\r\nДля использования визуального HTML-редактора используйте браузер Internet Explorer!', '3');
результат рассылки:
Код
INSERT INTO sb_logs
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(1, 16, 17, 9, "14.7.2008 10:17:09", 'gal@yandex.ru', 53, 1);
INSERT INTO sb_logs
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(3, 16, 14, 4, "14.7.2008 10:18:13", 'gal@yandex.ru', 54, 1);
INSERT INTO sb_logs
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(7, 14, 19, 10, "14.7.2008 10:20:57", 'gal@yandex.ru', 51, 1);
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(1, 16, 17, 9, "14.7.2008 10:17:09", 'gal@yandex.ru', 53, 1);
INSERT INTO sb_logs
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(3, 16, 14, 4, "14.7.2008 10:18:13", 'gal@yandex.ru', 54, 1);
INSERT INTO sb_logs
(`id`, `user_id`, `sub_id`, `pub_id`, `s_date`, `to_email`, `sub_member_id`, `status`)
VALUES
(7, 14, 19, 10, "14.7.2008 10:20:57", 'gal@yandex.ru', 51, 1);
Запрос:
Код
SELECT sp.id, sp.name, sp.`status`,
sl.sub_member_id,
sp.c_date,
sl.`status` as state_r
FROM sb_publications sp
RIGHT JOIN sb_logs sl
ON sl.sub_id = sp.sub_id
AND sp.`status` = '3'
AND sl.to_email = 'gal@yandex.ru'
INNER JOIN sb_subscribe_member sm
ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19'
ORDER BY sp.c_date DESC, sp.id DESC
sl.sub_member_id,
sp.c_date,
sl.`status` as state_r
FROM sb_publications sp
RIGHT JOIN sb_logs sl
ON sl.sub_id = sp.sub_id
AND sp.`status` = '3'
AND sl.to_email = 'gal@yandex.ru'
INNER JOIN sb_subscribe_member sm
ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19'
ORDER BY sp.c_date DESC, sp.id DESC
Результат:
Код
19 Для использования визуального 3 51 2008-07-14 11:18:27 1
10 вапыпвапыпвапыпвапып 3 51 2008-07-08 17:30:56 1
10 вапыпвапыпвапыпвапып 3 51 2008-07-08 17:30:56 1
А должен быть:
Код
19 Для использования визуального 3 51 2008-07-14 11:18:27 1
10 вапыпвапыпвапыпвапып 3 null 2008-07-08 17:30:56 0
10 вапыпвапыпвапыпвапып 3 null 2008-07-08 17:30:56 0

Спустя 3 часа, 1 минута, 8 секунд (14.07.2008 - 12:58) Ghost написал(а):
пардон, читаю внимательней. не по тому полю связка
Цитата
SELECT sp.id, sp.name, sp.`status`, sl.sub_member_id, sp.c_date, sl.`status` as state_r
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id )
LEFT JOIN sb_subscribe_member AS sm ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.`status` = '3' AND (sl.to_email = 'gal@yandex.ru' OR sl.to_email IS NULL)
ORDER BY sp.c_date DESC, sp.id DESC
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id )
LEFT JOIN sb_subscribe_member AS sm ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.`status` = '3' AND (sl.to_email = 'gal@yandex.ru' OR sl.to_email IS NULL)
ORDER BY sp.c_date DESC, sp.id DESC
Спустя 10 минут, 36 секунд (14.07.2008 - 13:09) Sylex написал(а):
Цитата(Ghost @ 14.7.2008, 16:58) [snapback]43412[/snapback]
пардон, читаю внимательней. не по тому полю связка
Цитата
SELECT sp.id, sp.name, sp.`status`, sl.sub_member_id, sp.c_date, sl.`status` as state_r
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id )
LEFT JOIN sb_subscribe_member AS sm ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.`status` = '3' AND (sl.to_email = 'gal@yandex.ru' OR sl.to_email IS NULL)
ORDER BY sp.c_date DESC, sp.id DESC
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id )
LEFT JOIN sb_subscribe_member AS sm ON sm.id = sl.sub_member_id
WHERE sp.sub_id = '19' AND sp.`status` = '3' AND (sl.to_email = 'gal@yandex.ru' OR sl.to_email IS NULL)
ORDER BY sp.c_date DESC, sp.id DESC
.... нивироятно!!! Ты гений!!!

ОГРОМНОЕ СПАСИБО !!
вот это работает:
Код
sl.to_email IS NULL
а я пробывал блин:
Код
sl.to_email = null
Спустя 33 минуты, 52 секунды (14.07.2008 - 13:43) Sylex написал(а):
все-таки... если в таблице sb_logs нет такой записи - то вообще не выводит ее 
а должен выводить + статус (не получена)

а должен выводить + статус (не получена)
Спустя 2 часа, 34 минуты, 20 секунд (14.07.2008 - 16:17) Sylex написал(а):
сделал пока просто двумя запросами

Спустя 18 минут, 28 секунд (14.07.2008 - 16:36) Alchemist написал(а):
тут есть несколько непоняток...
1) зачем есть два поля е-мейла: sl.to_email и sm.email. Я могу допустить что они могут быть разными, но из сопровождающего текста этого не видно...
2) В запросе предложенном Ghost'ом (я рассматривал только его, как последнюю бета-версию) цепляется таблица `sb_subscribe_member`. Зачем ? Из нее не берутся никакие данные и не даются никакие условия (кроме собственно условия связки)...
и я бы переставил условие е-мейла из WHERE в ON.
Собсно вот мой вариант запроса:
1) зачем есть два поля е-мейла: sl.to_email и sm.email. Я могу допустить что они могут быть разными, но из сопровождающего текста этого не видно...
2) В запросе предложенном Ghost'ом (я рассматривал только его, как последнюю бета-версию) цепляется таблица `sb_subscribe_member`. Зачем ? Из нее не берутся никакие данные и не даются никакие условия (кроме собственно условия связки)...
и я бы переставил условие е-мейла из WHERE в ON.
Собсно вот мой вариант запроса:
Код
SELECT sp.id, sp.name, sp.status, sl.sub_member_id, sp.c_date, sl.status as `state_r`
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id AND sl.to_email = 'gal@yandex.ru')
WHERE sp.sub_id = '19' AND sp.`status` = '3'
ORDER BY sp.c_date DESC, sp.id DESC
FROM sb_publications AS sp
LEFT JOIN sb_logs AS sl ON (sl.pub_id = sp.id AND sl.to_email = 'gal@yandex.ru')
WHERE sp.sub_id = '19' AND sp.`status` = '3'
ORDER BY sp.c_date DESC, sp.id DESC
Спустя 1 час, 44 минуты, 29 секунд (14.07.2008 - 18:20) Ghost написал(а):
Цитата(Sylex @ 14.7.2008, 13:43) [snapback]43417[/snapback]
все-таки... если в таблице sb_logs нет такой записи - то вообще не выводит ее
а должен выводить + статус (не получена)

а должен выводить + статус (не получена)
должен выводить, если выполняются условия после WHERE
Спустя 1 час, 2 минуты, 25 секунд (14.07.2008 - 19:23) Sylex написал(а):
Цитата(Alchemist)
1) зачем есть два поля е-мейла: sl.to_email и sm.email. Я могу допустить что они могут быть разными, но из сопровождающего текста этого не видно...
sl.email - уже отправлено, пользователь может сменить потом емайл, и он сменится в подписчиках - sm.email... а в логах будет реальный адрес на который была отправлена публикация!! + удобно смотреть реальную статистику, без всяких запросов из множества таблиц...
Цитата(Alchemist)
2) В запросе предложенном Ghost'ом (я рассматривал только его, как последнюю бета-версию) цепляется таблица `sb_subscribe_member`. Зачем ? Из нее не берутся никакие данные и не даются никакие условия (кроме собственно условия связки)...
действительно вопрос.... зачем же я это делал?

запрос попробую, спасибо
Спустя 36 секунд (14.07.2008 - 19:23) Sylex написал(а):
Цитата(Ghost @ 14.7.2008, 22:20) [snapback]43456[/snapback]
Цитата(Sylex @ 14.7.2008, 13:43) [snapback]43417[/snapback]
все-таки... если в таблице sb_logs нет такой записи - то вообще не выводит ее
а должен выводить + статус (не получена)

а должен выводить + статус (не получена)
должен выводить, если выполняются условия после WHERE
попробую еще раз повнимательней
Спустя 18 минут, 46 секунд (14.07.2008 - 19:42) Sylex написал(а):
ВСЕМ СПАСИБО! Ghost, Alchemist, оба варианта работают!!!
Действительно sb_subscribe_member была подключена лишне, и только запутала!!
и запрос вышел не сложный...
а sb_subscribe_member подключал поди для того, чтобы убедиться что подписчик такой есть... т.е. вдруг он отписался? Хотя понимаю сейчас, что это не нужно
Программирование - это умение продумывать все до мелочей
Действительно sb_subscribe_member была подключена лишне, и только запутала!!
и запрос вышел не сложный...
а sb_subscribe_member подключал поди для того, чтобы убедиться что подписчик такой есть... т.е. вдруг он отписался? Хотя понимаю сейчас, что это не нужно

Программирование - это умение продумывать все до мелочей

_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.