как выбрать только нулевые значения из одной и той же таблицы

usascha

Новичок
как выбрать только нулевые значения из одной и той же таблицы

Всем здрасте. Написал тут запрос на выборку всех подписчиков, у которых нет ни одной подписки на какое-либо из изданий. Он не работает, но отражает то что хочу сделать.
PHP:
SELECT *
FROM publication p, regions r
LEFT JOIN subscriber s ON s.oblast = r.reg_code
LEFT JOIN list l ON l.subscriber_id = s.id
AND p.p_id = l.publication_id
WHERE l.publication_id = 1 AND l.publication_amount = 0
AND (l.publication_id = 2 AND l.publication_amount = 0)
AND (l.publication_id = 3 AND l.publication_amount = 0)
AND (l.publication_id = 4 AND l.publication_amount = 0)
AND (l.publication_id = 5 AND l.publication_amount = 0)
GROUP BY l.subscriber_id, l.publication_id
ORDER BY s.subscriber_name ASC, r.reg_name ASC, l.publication_amount DESC
Если словами, то надо следующее: выбрать из таблицы list все записи, где для каждого l.publication_amount равному 0 есть свой l.publication_id (от 1 до 5). ПРИ ЭТОМ l.publication_amount может быть для одного и того же l.subscriber_id как ноль, так и не ноль.


Подсобите как его переделать.
 

vovik

Новичок
Если честно, ну совсем непонятно чего нужно получить.

PHP:
WHERE l.publication_id = 1 AND l.publication_amount = 0 
AND (l.publication_id = 2 AND l.publication_amount = 0)
Вот это мало того, что ничего не отражает, это просто кошмар :) Плюс к этому малопонятная группировка и малопонятные джойны. Совершенно безумный запрос.

Я бы предложил таким образом отразить что нужно сделать. Не рисовать абсурдные запросы, а нарисовать табличку с исходными данными на несколько строк и табличку с результатом запроса.
И описать словами еще раз по какому принципу делается выборка. Будут шансы получить ответ :)
 

Breeze

goshogun
Команда форума
Партнер клуба
выбрать из таблицы list все записи, где для каждого l.publication_amount равному 0 есть свой l.publication_id (от 1 до 5)
практически прямой перевод на буржуйский

[sql]
SELECT * FROM list l WHERE l.publication_amount=0 AND l.publication_id IN (1,2,3,4,5)
[/sql]

второе не совсем понял, но что-то подсказывает, что надо смотреть в сторону sum и having
 

Breeze

goshogun
Команда форума
Партнер клуба
zerkms

я про то же подумал, но выбрал другой вариант :)
 

_vampiro_

Новичок
хм, а может просто outer join? ведь если нет подписки- то нет и записи... так ведь?
 

ybilevych

Новичок
запрос на выборку всех подписчиков, у которых нет ни одной подписки на какое-либо из изданий
Возможно так?

[sql]
SELECT * FROM subscriber s LEFT JOIN list д ON (s.id = l.subscriber_id) WHERE (l.subscriber_id IS NULL OR l.publication_amount = 0) GROUP BY s.id
[/sql]
 

usascha

Новичок
ybilevych,
все эти варианты я уже пробовал. Ваш вариант просто выдает всех подписчиков.

Возможно, что-то у меня не настроено, но как только в запросе указываю l.publication_amount = IS NULL запрос начинает думаться неограниченное время и броузер выдает сообщение о превышении 30 секунд ожидания.

По ходу дела вопрос. Разумно ли назначать для поля l.publication_amount тип INT ? Если нет, то какой лучше?
Да, и vovik сказал, что у меня странные LEFT JOIN-запросы. Они какие-то неправильные?

Вот такой запрос мне казался бы очень правильным. Но броузер не дожидается его результатов. А в phpMyAdmin выборка получаеся полная - вообще все записи.
PHP:
SELECT *
FROM publication p, regions r
LEFT JOIN subscriber s ON s.oblast = r.reg_code
LEFT JOIN list l ON l.subscriber_id = s.id
AND p.p_id = l.publication_id
WHERE l.publication_amount IS NULL OR l.publication_amount = 0
GROUP BY l.subscriber_id
ORDER BY s.subscriber_name ASC, r.reg_name ASC
 

vovik

Новичок
usascha,
Если все-таки есть желание построить запрос.
Предлагаю максимально упростить задачу до того момента, который непонятен, и, повторюсь, показать исходные данные в виде таблицы (таблиц), и результат запроса в таком же виде.

Например:
PHP:
У меня есть таблица люди:
PersonID | PersonName
1        | Вася
2        | Петя 
3        | Таня

И есть таблица домашние животные, которые принадлежат людям:
AnimalID | PersonID | AnimalName
1        | 1        | Жучка
2        | 3        | Белка

Как мне получить людей, у которых нет домашних животных ?  Т.е.
PersonID | PersonName
2        | Петя
Потому что запросы, которые можно наблюдать на этой странице, бессмысленны и по ним понять что нужно - невозможно.

Если интересно что именно неправильно в запросах. Судить именно о неправильности не берусь, так как опять же непонятно что запрос должен вернуть. Я написал, что все это "малопонятно". CROSS JOIN без условия между таблицами в WHERE сомнителен. А SELECT * и GROUP BY - маразм чистой воды. Про l.publication_id = 1 AND l.publication_id = 2 даже говорить не буду.

Немножко сбивчиво написал. Прощу прощения, пятница, подшофе. Надеюсь все же что имелось в виду понять можно.
 

usascha

Новичок
vovik, сделать нужно следующее:
выбрать из таблицы list все записи, где для каждого l.publication_amount равному 0 есть свой l.publication_id (от 1 до 5). ПРИ ЭТОМ l.publication_amount может быть для одного и того же l.subscriber_id как ноль, так и не ноль.

есть подписчики - в таблице 's'
есть издания - в таблице 'p'
есть регионы - в таблице 'r'
есть сводная таблица 'l', в которой эти талицы объединены по foreign key l.subscriber_id (объединение типа многие-ко-многим).

Есть задача выбора списка подписчиков по названию подписанного издания -поле 'l.publication_id'.

Те подписчики, которые имеют подписку 1-го и более экземпляров какого-то издания выбираются (кстати, с помощью этих же неправильных LEFT JOIN'ов).

Теперь стоит задача выбрать тех подписчиков, у которых нет подписки ни на одно из изданий.

Уже есть запрос:
PHP:
SELECT *
FROM publication p, regions r
LEFT JOIN subscriber s ON s.oblast = r.reg_code
LEFT JOIN list l ON l.subscriber_id = s.id
AND p.p_id = l.publication_id
WHERE l.publication_amount IS NULL OR l.publication_amount = 0
GROUP BY l.subscriber_id
ORDER BY s.subscriber_name ASC, r.reg_name ASC
Этот запрос выдает в выборке всех подписчиков: и тех у которых нет ни одной подписки, и тех у которых есть какая-то одна подписка, а остальные значения поля l.publication_amount либо равны 0 или поле (оно имеет тип INT) пустое, а default = 0.


Вот такая проблема. Это описание, как Вы просили, соответствует моменту, который непонятен.
 
Сверху