Выбор всего лишь из одной таблицы

usascha

Новичок
Выбор всего лишь из одной таблицы

Здрасте всем.

Все - я сдался! Уже раз сто переделал запрос, но сделать выборку никак не могу.

Задача: выбрать из таблицы все записи, где publication_amount = 0 или вообще еще не существует.

Таблица, которая является промежуточной для 3-х других, может содержать следующие данные

Код:
l_id | subscriber_id | publication_id | period | publication_amount
1       1                   1              01            0
2       1                   2              01            0
3       1                   3              01            0
4       1                   4              01            0
5       1                   5              01            0
6       2                   1              00            1
7       2                   3              00            4
8       2                   4              99            6
9       3                   2              02            0
10     3                   5              02            0

Так вот, задача выбрать все те subscriber_id, у которых все publication_amount = 0 или поскольку publication_id нет, то и publication_amount тоже нет. Если хоть одно значение publication_amount > 0, ТО такой subscriber_id выбирать не надо.

Не знаю имеет ли смысл приводить любой из вариантов моих запросов, они все не годятся, но на момент написания поста мучил такой вариант:
Код:
SELECT s.*, p.*, r.* , COUNT(DISTINCT l.publication_amount) AS l_pam, l.*
FROM regions r, subscriber s, list l
LEFT JOIN publication p ON p.p_id = l.publication_id
WHERE l.subscriber_id = s.id
AND s.oblast = r.reg_code
AND l.subscriber_id NOT IN 
(
SELECT subscriber_id
FROM list
WHERE publication_amount !=0
OR publication_amount !=''
GROUP BY period, publication_id
)
GROUP BY l.period, l.publication_amount, l.subscriber_id
ORDER BY s.subscriber_name ASC, r.reg_name ASC
Этот запрос вешает сервер на очень долгое время и броузер не дожидается ответа.
 

Кром

Новичок
Т.е. данный запрос не работае или работает но медленно? Индексы стоят?
Сделай дамп структуры и данных, 10-15 строк и выложи здесь, чтоб можно было поэксперементировать с запросами.
 

usascha

Новичок
Проверить работает долго или не работает не могу, т.к. запрос просто не завершается. Думаю, что он правильный, но выполнение его более чем несколько секунд просто неоправдано.

Данные:
l_id subscriber_id publication_id period publication_amount
1 1 1 062 0
1225 1 5 062 0
1224 1 4 062 0
1223 1 3 062 0
1222 1 2 062 0
10 10 1 061 0
1229 10 5 061 0
1228 10 4 061 0
1227 10 3 061 0
1226 10 2 061 0
100 100 1 001 0
1000 1000 3 001 0
1001 1001 3 001 0
1002 1002 3 001 0
1003 1003 3 001 0
1004 1004 3 001 0
1005 1005 3 001 0
1006 1006 3 001 0
1007 1007 3 001 0
1008 1008 3 001 0
1009 1009 3 001 0
101 101 1 001 0
1010 1010 3 001 0
1011 1011 3 001 0
1012 1012 3 001 0
1013 1013 3 001 0
1014 1014 3 001 0
1015 1015 3 001 0
1016 1016 3 001 0
1196 1016 1 001 0

Данные заменил: первая выборка не очень была показательна. Данные настоящие.

Структура:

CREATE TABLE `list` (
`l_id` int(5) NOT NULL auto_increment,
`subscriber_id` char(5) NOT NULL default '0',
`publication_id` tinyint(4) default '0',
`period` char(3) NOT NULL default '000',
`publication_amount` smallint(4) NOT NULL default '0',
PRIMARY KEY (`l_id`),
KEY `l_id` (`l_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1230 ;
 

vovik

Новичок
Навскидку, долго не думал. Выборка из одной таблицы subscriber_id, где все publication_amount = 0.

PHP:
SELECT subscriber_id
FROM list
GROUP BY subscriber_id
HAVING MIN(publication_amount) = 0 AND MAX(publication_amount) = 0
 

dr-sm

Новичок
может так?
PHP:
SELECT subscriber_id
FROM list
GROUP BY subscriber_id
HAVING SUM(publication_id) = 0 OR SUM(publication_amount) = 0
CREATE TABLE `list` (
`l_id` int(5) NOT NULL auto_increment,
`subscriber_id` char(5) NOT NULL default '0',
`publication_id` tinyint(4) default '0',
`period` char(3) NOT NULL default '000',
`publication_amount` smallint(4) NOT NULL default '0',
PRIMARY KEY (`l_id`),
# KEY `l_id` (`l_id`) - это не нужно
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1230 ;

У тебя все поля здесь NOT NULL, ты же говоришь, что publication_id может не существовать (и сравниваешь в своем запросе числовое поле с ''). это неправильно.
 

usascha

Новичок
Автор оригинала: dr-sm
У тебя все поля здесь NOT NULL, ты же говоришь, что publication_id может не существовать (и сравниваешь в своем запросе числовое поле с ''). это неправильно.
Я знаю про это несоответствие. Ее исправление как-то влияет на решение моей проблемы?

Вообще-то как еще сделать контроль количетва подписок, если записи для конкретного издания нет, а подписчик имеет подписку на какое-то другое издание?

-~{}~ 24.07.06 19:44:

нет, ребяты, эти варианты не проходят. В выборке все записи: т.е. беруться те subscriber_id, у которых хоть один publication_amount = 0.

Какие еще есть варианты? Плз.
 

zarus

Хитрожопый макак
[SQL]
SELECT s.subscriber_id, IFNULL( count( l.publication_id ) , 0 ) AS publications_count, IFNULL( SUM( l.publication_amount ) , 0 ) AS publications_amount
FROM subscriber s
LEFT JOIN list l ON (s.subscriber_id = l.subscriber_id)
GROUP BY s.subscriber_id
HAVING IFNULL( SUM( l.publication_amount ) , 0 ) = 0
[/SQL]
Пользуй наздоровье.
 

usascha

Новичок
zarus, а вот и большущее спасибо !! Счастлив до зеленых соплей.
Окончательно мой код получился вот такой большой:
[SQL]
SELECT s.*, p.*, r.* , IFNULL( count( l.publication_id ) , 0 ) AS publications_count, IFNULL( SUM( l.publication_amount ) , 0 ) AS publications_amount, l.*
FROM regions r, subscriber s
LEFT JOIN list l ON ( s.id = l.subscriber_id )
LEFT JOIN publication p ON p.p_id = l.publication_id
WHERE s.oblast = r.reg_code
GROUP BY s.id, l.period
HAVING IFNULL( SUM( l.publication_amount ) , 0 ) = 0
ORDER BY s.subscriber_name ASC, r.reg_name ASC
[/SQL]

Единственное, что хотел уточнить у знающего человека, так это как и почему объявляются два алиаса - AS publications_amount и AS publications_count. Я привык, что если объявляю алиас, то его использую потом. тут же только сервер их использует. Верно?
 
Сверху