Запрос: взять те планы, на которые пользователь еще НЕ подписался

webxtor

Новичок
Запрос: взять те планы, на которые пользователь еще НЕ подписался

У меня такая проблема... ну никак не получается одним запросом.. просто голова кругом :mad:

Итак, есть 2 таблицы (из которых нужна выборка)

plans: id, name
users_plans: user_id, plan_id

Пользователь может подписываться на несколько планов сразу при регистрации.
А вот как вывести те планы, на которые он еще не подписался при регистрации одним запросом....? :confused:
 

webxtor

Новичок
Это только так кажется, что будто очень просто сделать, вы попробуйте сделать запрос, ув. tony2001

...where users_plans.user_id IS NULL ничего не даст, так как там полно других пользователей, которые уже подписались на все возможные планы!

Я уже все перепробовал с LEFT JOIN!! И вот поэтому пришел на форум за помощью!
 

SNiP

Новичок
... where plans.id <> users_plans.pland_id ...

http://phpclub.ru/mysql/doc/multiple-tables.html
 

webxtor

Новичок
Автор оригинала: SNiP
... where plans.id <> users_plans.pland_id ...
Такое не покатит.. :( Ведь в таблице users_plans есть все планы!! (Если учесть, что на каждый план подписался как минимум один пользователь).

Автор оригинала: SNiP http://phpclub.ru/mysql/doc/multiple-tables.html
В этой статье LEFT JOIN и не пахнет :rolleyes:

Попробую попытаться добавить в выборку вторую виртульаную таблицу users_plans....

-~{}~ 07.03.05 12:15:

Пересмотрел почти все топики по запросу LEFT JOIN - не нашел ничего похожего!!

Вот немного то, но тут более простая задача - нужно не для конкретного юзера, а для всех сразу...
http://phpclub.ru/talk/showthread.php?s=&postid=443103

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

SELECT DISTINCT p.id AS plan_id, p.name
FROM payment_plans AS p
LEFT JOIN users_plans AS up ON p.id = up.plan_id
WHERE up.user_id <> '42' OR up.user_id IS NULL


Выдает просто все планы которые есть. Оно и понятно, ведь up.user_id <> '42' не дает нужного ограничения, поскольку на каждый план подписан хотя бы один юзер. up.user_id IS NULL вообще никакой силы не дает в случае, если в таблице связей присутсвуют все планы хотя бы раз!

SELECT DISTINCT p.id AS plan_id, p.name, up.user_id
FROM payment_plans AS p
LEFT JOIN users_plans AS up ON p.id = up.plan_id
WHERE up.user_id =42 OR up.user_id IS NULL
HAVING up.user_id !=42


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

chira

Новичок
Код:
SELECT p.id AS plan_id, p.name
FROM payment_plans AS p
LEFT JOIN users_plans AS up ON p.id = up.plan_id AND up.user_id = '42'
WHERE up.user_id IS NULL
 

webxtor

Новичок
:D

РАБОТАЕТ!!!!!

То есть выходит то условие, которое используется в ON - первичное, а WHERE как бы накладывается на него?

Просто вот пытаюсь понять, почему не работает:

Код:
SELECT p.id AS plan_id, p.name
FROM payment_plans AS p
LEFT JOIN users_plans AS up ON p.id = up.plan_id 
WHERE up.user_id IS NULL AND up.user_id = '42'
 

alpine

Новичок
[sql]
WHERE up.user_id IS NULL AND up.user_id = '42'
[/sql]
как такое может одновременно быть?!
 

webxtor

Новичок
Хм.. точно! Не заметил :rolleyes:

Ну а как может быть

[sql]AND up.user_id = '42'
WHERE up.user_id IS NULL
[/sql]

Но такое точно может!! Никак вот не пойму каким же образом оно работает :-|

chira
Обьясни плиз!! :)
 

chira

Новичок
соединяя две таблицы, MySQL берёт по одной записи из таблицы payment_plans и пытается найти нужные из таблицы users_plans, критерий "нужности" стоит за ON т.е. условие соединения данных из таблицы users_plans
если в users_plans нет нужных записей, то генериться строка у которой все значения полей NULL и она соединяется со строкой из таблицы payment_plans

в WHERE помещаются общие фильтры и условия
 
Сверху