
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
13.08.2014, 13:19:59
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Приветствую господа! Вопрос может быть будет совсем для вас простой, но сам не могу решить проблему. Есть таблица PAGES, в ней поля ID_PAGE (уникальный номер страницы), TITLE_PAGE (заголовок страницы) Есть вторая таблица USERS в ней есть поле ACCESS_PAGES (здесь через запятую перечисляются ID страниц, которые доступны именно этому пользователю) Таблица PAGES ----------------------------- | id_pages | title_page | ----------------------------- | 1 | Продукт | ----------------------------- | 2 | Магазин | ----------------------------- | 3 | Дар | ----------------------------- | 4 | Постав | ----------------------------- таблица USERS ------------------------ | id_user | access_list | ------------------------ | 1 | 1,2,4 | ------------------------ Что я хочу: получить перечень страниц для конкретного пользователя на основе доступных ему страниц такого формата ---------- | title_pages | --------- | Продукт | --------- | Магазин | --------- | Постав | --------- Составляю такой запрос: Код: sql 1. Получаю строку: "1,2,4" Потом формирую второй отдельный запрос на основе этой строки Код: sql 1. тут я получаю искомый результат, НО я хочу получить все на основе одного запроса, а не двух самостоятельных, что-то вроде этого Код: sql 1. Но мне почему-то при таком запросе выдается только одна страница ---------- | title_pages | --------- | Продукт | --------- а остальные не отрабатываются, не могу понять в чем дело. Помогите пожалуйста -_- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2014, 13:53:33
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
Himuздесь через запятую перечисляются ID страниц, которые доступны именно этому пользователю 8434456 и вообще вся та тема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2014, 15:07:23
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Что-то я вообще от туда ничего не понял( единственное понятно: просто так моим запросом не выдаст в нужном формате Тогда вопрос такой, а как правильно (или корректнее) оформить таблицы, чтобы можно было получить список доступных страниц для пользователей. Проект находится на стадии разработки и хотелось бы реализовать такой механизм максимально правильно и с наименьшим количеством отдельных обращений к серверу MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.08.2014, 19:30:18
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
Himu, стандартная схема: pages (id,...) users (id,...) page2user (id_page,id_user) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 07:12:15
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
tanglirHimu, стандартная схема: pages (id,...) users (id,...) page2user (id_page,id_user) И получается количество записей в таблице page2user = pages * users? Это самый "правильный" вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 08:35:46
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
плохая идея, сувать субселект в WHERE, подзапрос будет выполняться для сравнения каждой строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 09:47:30
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
Himu, Код: sql 1. 2. 3. Оно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 09:57:27
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
UsersHimu, Код: sql 1. 2. 3. Оно? Попробовал, выдает "title_page" только первой страницы, а во второй колонке перечень доступных страниц для пользователя. Да и в принципе не могу понять смысла запроса =) Как в JOIN можно сравнивать строку (поле "access_pages" ведь является строкой) и число (поле "id_pages" это просто число) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:06:53
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
Himu, Так, посмотрел внимательней. Неправильно сделали структуру базы данных. Не нужна вам там текстовая строка access_list, а нужно либо сделать так же id_page и вставлять 3 и более строки с id трех и более страниц , либо промежуточную таблицу. Почему не нужно: большая возможность для юзера налажать при вводе - и в любом случае, хранение в этом поле id страниц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:08:12
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Himu,авторПопробовал, выдает "title_page" только первой страницы, а во второй колонке перечень доступных страниц для пользователя. Да и в принципе не могу понять смысла запроса =) Как в JOIN можно сравнивать строку (поле "access_pages" ведь является строкой) и число (поле "id_pages" это просто число)Ха, батенька, дак у вас база не нормализована, если в access_pages находится множество id'шников через ','. Попробуйте, так: Код: sql 1. 2. 3. 4. 5. Хотя, настоятельно рекомендую нормализовать базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:08:44
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Hett http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html попробовал сделать через Exist выдается так же одна строка, остальные строки не выбираются ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:18:10
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
sigmovХа, батенька, дак у вас база не нормализована, если в access_pages находится множество id'шников через ','. Я с вами согласен с нормализацией. Нормализовать в данном случае - это создать отдельную таблицу AccessPages, в которой хранить записи вида: id_page - id_user? И прописать соответственно для каждого пользователя столько записей, сколько страниц ему доступно? Правильно ли это? Просто получается размер таблицы будет равен id_page * id_user (при полном доступе). sigmovПопробуйте, так: Код: sql 1. 2. 3. 4. 5. А вот это то что нужно! Спасибо большое за скрипт! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:33:01
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
Himu, Написал же. Либо в эту же users добавляйте поле, либо промежуточную. Промежуточная более верна. То, что размер таблицы может оказаться большим - и что? там два интовых поля. Индекс не забудьте, на любое поле, которое с чем-то джойнится - нужен индекс. Все будет летать, даже если размер таблицы супербольшой. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 10:42:01
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Спасибо большое за советы и ответы. Тема закрыта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 11:58:14
|
|||
|---|---|---|---|
IN на основе SELECT |
|||
|
#18+
HimuА вот это то что нужно!только вот скорость скорее всего упадёт ниже плинтуса в случае реального использования ну, конечно, если там не полтора пользователя :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.08.2014, 12:37:47
|
|||
|---|---|---|---|
|
|||
IN на основе SELECT |
|||
|
#18+
Himu,HimuЯ с вами согласен с нормализацией. Нормализовать в данном случае - это создать отдельную таблицу AccessPages, в которой хранить записи вида: id_page - id_user? И прописать соответственно для каждого пользователя столько записей, сколько страниц ему доступно? Правильно ли это? Просто получается размер таблицы будет равен id_page * id_user (при полном доступе). Верно. Но это лучше чем хранить id'шники в виде строки через ',' в поле типа VARCHAR(N). Лучше и по скорости доступа и по размеру(да, VARCHAR(N) жрет много места). Через ',' можно хранить если это просто справочная информация, по которой выборка никогда не производится, тогда Да - денормализация оправдана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&tablet=1&tid=1834367]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 342ms |

| 0 / 0 |
