|
|
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
У меня такая проблема... ну никак не получается одним запросом.. просто голова кругом Итак, есть 2 таблицы (из которых нужна выборка) plans: id, name users_plans: user_id, plan_id Пользователь может подписываться на несколько планов сразу при регистрации. А вот как вывести те планы, на которые он еще не подписался при регистрации одним запросом....? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 01:15 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 11:37 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 11:45 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
Имхо так: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 16:01 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
ComiljouИмхо так: SELECT a.id FROM plans as a ,users_plans as b WHERE user_id=1 AND plan_id !=a.id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 16:04 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
что тебя всё-таки не устраивает в решении vecalionа? Тот запрос выдаёт именно те планы, на которые не подписан юзер. ------------------ да пребудет с вами гугл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 21:53 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
Не устраивает, вероятно, тем, что если юзеров больше одного -- непонятно, что выдаёт запрос.) Там не указано, для какого юзера идёт выборка, и указать не выходит. Такой вариант-то очевиден... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 22:30 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
DocAlНе устраивает, вероятно, тем, что если юзеров больше одного -- непонятно, что выдаёт запрос.) Там не указано, для какого юзера идёт выборка, и указать не выходит. Такой вариант-то очевиден... Верно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 23:39 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
В общем сделал! Код: plaintext 1. 2. 3. 4. Мне помог chira из phpclub.ru Вот как он прокомонтеровал (в мануале написано примерно тоже самое, но более туманно): chiraсоединяя две таблицы, MySQL берёт по одной записи из таблицы payment_plans и пытается найти нужные из таблицы users_plans, критерий "нужности" стоит за ON т.е. условие соединения данных из таблицы users_plans если в users_plans нет нужных записей, то генериться строка у которой все значения полей NULL и она соединяется со строкой из таблицы payment_plans в WHERE помещаются общие фильтры и условия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2005, 23:42 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
если юзеров больше одного, выдаёт для каждого юзера планы, на которые он не подписан, если интересует инфа по конкретному юзеру... сорри, мне казалось, что засунуть условие up.user_id = '42' в фильтр WHERE - очевидное решение chiraв WHERE помещаются общие фильтры и условия ------------------ да пребудет с вами гугл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2005, 15:19 |
|
||
|
Помогите сделать запрос! А можно ли вообще?
|
|||
|---|---|---|---|
|
#18+
А вы пробовали запихнуть условие на пользователя в WHERE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2005, 02:28 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=32949359&tid=1854281]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 508ms |

| 0 / 0 |
