[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите пожалуйста с запросом!!
Sylex
уже просто не могу.... не думаю, что он сложный, просто мозг сел...

Сложно описать то, что хочу получить... но попробую. Создаю проект "Рассылка", который позволяет пользователям создавать собственные рассылки, и в них публикации - и рассылать подписчикам публикации в данной рассылке.

Есть таблица 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='Публикации';



Есть таблица 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='Статистика рассылок';


Также есть таблица 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='Подписчики';


Нужно получить Список ВСЕХ публикации в данной рассылке (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


Результат дает не верный - выбирает записи более одного раза (повторяются), либо статус = '1' всегда sad.gif

ПОМОЖИТЕ ПЛИЗ!!! А то я точно в отпуск седня не уйду...................

И в условие sl.to_email = 'gal@yandex.ru' запихиваить тож по-моему не правильно... т.к. он конкретно привяжется к этой таблице, и если пользователя с данным E-mail не будет - то он вообще не покажет данную публикацию... sad.gif



Спустя 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');


Публикации:
Код
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');


результат рассылки:

Код
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);


Запрос:
Код
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


Результат:
Код
19        Для использования визуального    3        51        2008-07-14 11:18:27        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


sad.gif

Спустя 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

Спустя 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



.... нивироятно!!! Ты гений!!! clapping.gif

ОГРОМНОЕ СПАСИБО !!

вот это работает:
Код
sl.to_email IS NULL


а я пробывал блин:
Код
sl.to_email = null

Спустя 33 минуты, 52 секунды (14.07.2008 - 13:43) Sylex написал(а):
все-таки... если в таблице sb_logs нет такой записи - то вообще не выводит ее sad.gif

а должен выводить + статус (не получена)

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

Спустя 18 минут, 28 секунд (14.07.2008 - 16:36) Alchemist написал(а):
тут есть несколько непоняток...

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

Спустя 1 час, 44 минуты, 29 секунд (14.07.2008 - 18:20) Ghost написал(а):
Цитата(Sylex @ 14.7.2008, 13:43) [snapback]43417[/snapback]
все-таки... если в таблице sb_logs нет такой записи - то вообще не выводит ее sad.gif

а должен выводить + статус (не получена)

должен выводить, если выполняются условия после 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`. Зачем ? Из нее не берутся никакие данные и не даются никакие условия (кроме собственно условия связки)...


действительно вопрос.... зачем же я это делал? dumau.gif

запрос попробую, спасибо

Спустя 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 нет такой записи - то вообще не выводит ее sad.gif

а должен выводить + статус (не получена)

должен выводить, если выполняются условия после WHERE


попробую еще раз повнимательней

Спустя 18 минут, 46 секунд (14.07.2008 - 19:42) Sylex написал(а):
ВСЕМ СПАСИБО! Ghost, Alchemist, оба варианта работают!!!

Действительно sb_subscribe_member была подключена лишне, и только запутала!!

и запрос вышел не сложный...

а sb_subscribe_member подключал поди для того, чтобы убедиться что подписчик такой есть... т.е. вдруг он отписался? Хотя понимаю сейчас, что это не нужно smile.gif

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


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

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.