Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите сделать запрос! А можно ли вообще? / 12 сообщений из 12, страница 1 из 1
07.03.2005, 01:15
    #32949359
webxtor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
У меня такая проблема... ну никак не получается одним запросом.. просто голова кругом

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

plans: id, name
users_plans: user_id, plan_id

Пользователь может подписываться на несколько планов сразу при регистрации.
А вот как вывести те планы, на которые он еще не подписался при регистрации одним запросом....?
...
Рейтинг: 0 / 0
07.03.2005, 11:37
    #32949458
vecalion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
MySQL manual
mysql> SELECT table1.* FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;

Этот пример находит все строки в таблице table1 с величиной id, которая не присутствует в таблице table2 (т.е. все строки в table1, для которых нет соответствующих строк в table2). Конечно, это предполагает, что table2.id объявлен как NOT NULL. See Раздел 5.2.6, «Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN».


В качестве table1 будет выступать таблица plans, в качестве table2 - user_plans
...
Рейтинг: 0 / 0
07.03.2005, 11:45
    #32949467
webxtor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
vecalion MySQL manual
mysql> SELECT table1.* FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.id IS NULL;

Этот пример находит все строки в таблице table1 с величиной id, которая не присутствует в таблице table2 (т.е. все строки в table1, для которых нет соответствующих строк в table2). Конечно, это предполагает, что table2.id объявлен как NOT NULL. See Раздел 5.2.6, «Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN».


В качестве table1 будет выступать таблица plans, в качестве table2 - user_plans

Такой запрос не покатит! Я бы не стал постить в форум, если бы это было тривиально.

Мне нужно взять для конкретного юзера с id скажем 42.

SELECT DISTINCT p.id AS plan_id, p.name, p.fee
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 - вообще никакой роли не играет. Так как на каждый план подпислася хотя бы один юзер!

И так далее... мне кажется это вообще невозможно... Разве что поэкспериментировать со второй виртуальной таблицей users_plans...
...
Рейтинг: 0 / 0
07.03.2005, 16:01
    #32949629
Comiljou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
Имхо так:
SELECT a.id,b.user_id,b.plan_id FROM plans as a ,users_plans as b WHERE user_id=1 AND plan_id !=a.id
...
Рейтинг: 0 / 0
07.03.2005, 16:04
    #32949633
Comiljou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
ComiljouИмхо так:
SELECT a.id FROM plans as a ,users_plans as b WHERE user_id=1 AND plan_id !=a.id
...
Рейтинг: 0 / 0
07.03.2005, 21:53
    #32949821
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
что тебя всё-таки не устраивает в решении vecalionа?
Тот запрос выдаёт именно те планы, на которые не подписан юзер.
------------------
да пребудет с вами гугл!
...
Рейтинг: 0 / 0
07.03.2005, 22:30
    #32949840
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
Не устраивает, вероятно, тем, что если юзеров больше одного -- непонятно, что выдаёт запрос.) Там не указано, для какого юзера идёт выборка, и указать не выходит. Такой вариант-то очевиден...
...
Рейтинг: 0 / 0
07.03.2005, 23:39
    #32949856
webxtor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
DocAlНе устраивает, вероятно, тем, что если юзеров больше одного -- непонятно, что выдаёт запрос.) Там не указано, для какого юзера идёт выборка, и указать не выходит. Такой вариант-то очевиден...

Верно!
...
Рейтинг: 0 / 0
07.03.2005, 23:42
    #32949857
webxtor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
В общем сделал!

Код: plaintext
1.
2.
3.
4.
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

Мне помог chira из phpclub.ru

Вот как он прокомонтеровал (в мануале написано примерно тоже самое, но более туманно):

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

в WHERE помещаются общие фильтры и условия
...
Рейтинг: 0 / 0
08.03.2005, 15:19
    #32950061
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
если юзеров больше одного, выдаёт для каждого юзера планы, на которые он не подписан, если интересует инфа по конкретному юзеру...
сорри, мне казалось, что засунуть условие up.user_id = '42' в фильтр WHERE - очевидное решение
chiraв WHERE помещаются общие фильтры и условия
------------------
да пребудет с вами гугл!
...
Рейтинг: 0 / 0
09.03.2005, 02:28
    #32950317
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
А вы пробовали запихнуть условие на пользователя в WHERE?
...
Рейтинг: 0 / 0
09.03.2005, 12:44
    #32951062
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сделать запрос! А можно ли вообще?
аа... ыы... облажался...
------------------
да пребудет с вами гугл!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите сделать запрос! А можно ли вообще? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]