adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Выбор конкретных строк из MYSQL
На страницу 1 2
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 19-40    Заголовок сообщения: Выбор конкретных строк из MYSQL Ответить с цитатой

Вот думаю над такой задачей.

Есть таблица.

И есть массив с id строк нужных из этой таблицы.

Как правильно сделать выборку строк с id из этой таблицы ?

Интересует пример кода запроса.

Мне в голове рисуется нечто с OR ... OR - но почему-то думаю, что это не совсем нужный вариант.

Количество id может быть большим, т.е. не фиксированное кол-во.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
DenisP
Форумчанин
СообщениеДобавлено: Чт 24-04-08 : 19-47    Заголовок сообщения: Ответить с цитатой

А эти id у тебя в другой таблице?

Если это просто массив какой-то, то можно еще в строну IN( ) копнуть, или UNION.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 19-51    Заголовок сообщения: Ответить с цитатой

Если они идут подрят то в вайле напиши id>N and id < M
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 19-51    Заголовок сообщения: Ответить с цитатой

Верно, в другой. Но там они в текстовом поле через запятую перечислены. Поэтому думаю без перегонки в массив не обойтись.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 19-52    Заголовок сообщения: Ответить с цитатой

BS
Нет, это слишком просто бы было.

Там в том и смысл, что конкретные.

У меня просто знаний MySQL не хватает достаточно


Два тупых способа я конечно придумал, но мне они не катят Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 19-53    Заголовок сообщения: Ответить с цитатой

DenisP
Цитата:
Если это просто массив какой-то, то можно еще в строну IN( ) копнуть, или UNION.


Вот тут можно поподробнее ?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 19-54    Заголовок сообщения: Ответить с цитатой

Ой, вэа, в условии)
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 19-56    Заголовок сообщения: Ответить с цитатой

Richard Ferlow писал(а):
Вот тут можно поподробнее ?


Получиться примерно что то похожее.
Вопрос теперь с производительностью.
Зависит, что ты хочешь получить.
Может у тя не правильня архитекрута БД?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 19-58    Заголовок сообщения: Ответить с цитатой

BS
Я понял о чем ты, но такая выборка не подойдет Smile

Думаю может есть какая-то выборка в духе WHERE ID=/тут массив или через запятую как-то/

Потому что если запрос динамически формировать, этих OR будет штук 50 там - думаю это не есть верно.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-00    Заголовок сообщения: Ответить с цитатой

В таком случае храни айдишники отдельно, а не в строке Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
DenisP
Форумчанин
СообщениеДобавлено: Чт 24-04-08 : 20-03    Заголовок сообщения: Ответить с цитатой

Richard Ferlow
В общем-то это не есть гуд с точки зрения нормализации данных, подумай над схемой данных, может быть все-таки разнесешь по разным полям. И удобнее будет, и производительность повысишь (скорее всего, если объемы будут большие).

Если производительность не особо важна, то условие можно написать вот так (не знаю синтаксиса MySQL, сама идея):

pos( ','||str(ID)||',' , ','||строка_с_ID||',') <> 0

где: pos функция, которая тебе вернет позицию вхождения одной строки в другую; str функция преобразующая число в текст, ','|| и ||',' с двух сторон обрамляют, чтоб крайние значения найти. Предполагаю, что в строке строка_с_ID нет пробелов.
Вот это я извратился Shocked Very Happy
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
DenisP
Форумчанин
СообщениеДобавлено: Чт 24-04-08 : 20-05    Заголовок сообщения: Ответить с цитатой

Richard Ferlow писал(а):
DenisP
Цитата:
Если это просто массив какой-то, то можно еще в строну IN( ) копнуть, или UNION.


Вот тут можно поподробнее ?


Это я прдположил до того, как узнал, что у тебя ID в строку засунуты Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-08    Заголовок сообщения: Ответить с цитатой

DenisP писал(а):
Вот это я извратился

Не то слово, имхо проблема в корне) А мы боримся с её сделствием.
Покешь ка архитикруту БД
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 20-13    Заголовок сообщения: Ответить с цитатой

Просто то, как есть, проектировалось изначально без этого нововведения и было удобным.

В массиве таким образом хранится id элементов, к которым пользователь имеет доступ.

Там где это использовалось - очень удобно.


Еще мысль появилась - права этих нововведений иначе организовать в таблицах, отдельно от того, что есть. Надо подумать.

DenisP
Если по честной, не очень понял что ты имел ввиду Smile Догадываюсь так, что предложил функцию перевода строки в что-то другое Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-17    Заголовок сообщения: Ответить с цитатой

Проще распарсить строку....
Повторяю еще раз и медленно строку с айдишниками убираешь, делаешь таблицу, с указателем на поле где раньше была строка и айдишниками. Делаешь внешний ключ, каскадное удаление или что тебе там надо...
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
DenisP
Форумчанин
СообщениеДобавлено: Чт 24-04-08 : 20-18    Заголовок сообщения: Ответить с цитатой

Richard Ferlow писал(а):
В массиве таким образом хранится id элементов, к которым пользователь имеет доступ.

для этого вводится еще одна таблица, типпичный пример связи многие-ко-многим.

Цитата:

DenisP
Если по честной, не очень понял что ты имел ввиду Smile Догадываюсь так, что предложил функцию перевода строки в что-то другое Smile


Нет, предложил ID текущей записи найти в строке, которая содержит список ID.
Т.к. они у тебя разделены запятыми - обрамляем искомый ID запятыми.
Пример: ID =4, Строка_с_ID = 3,4,5,44
Значит ищем ,4, в ,3,4,5,44,

Но ищем меееееееедлеееееенннноооооо Smile
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-22    Заголовок сообщения: Ответить с цитатой

DenisP писал(а):
для этого вводится еще одна таблица, типпичный пример связи многие-ко-многим.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Чт 24-04-08 : 20-28    Заголовок сообщения: Ответить с цитатой

Хм....


Видимо в этом случае придется вторую схему прав заводить.


Таким образом

Будет две таблицы.


Первая - id user, id строки

Потом делать общий запрос для двух таблиц - из второй выбрать id, где у id user есть id=id строки

Как-то так что ли.


Очень не хочется, потому как чтобы нарастить существующую систему с текстовым полем, нужно просто нарастить то, что есть.

Может тупое сделать преобразование - и строку виду 2,5,7 заменой перевести в id=2 OR id=5 OR id = 7 и использовать в запросе ? Smile) Сколько интересно запрос выдержит.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
BS
Эксперт
СообщениеДобавлено: Чт 24-04-08 : 20-33    Заголовок сообщения: Ответить с цитатой

НИЧЕГО ДЕЛАТЬ НЕ НАДО!!!!!!!!!!!!!

user.id = str.usre_id
Вот условие конкретенации.

user_id в str бует иметь вторичный ключ. Я НЕ ПОНИМАЮ, о каких правах ты говоришь.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение Посетить сайт автора   Номер ICQ
DenisP
Форумчанин
СообщениеДобавлено: Чт 24-04-08 : 20-35    Заголовок сообщения: Ответить с цитатой

Ну вот что-то в этом роде



Цитата:
Может тупое сделать преобразование - и строку виду 2,5,7 заменой перевести в id=2 OR id=5 OR id = 7 и использовать в запросе ? ) Сколько интересно запрос выдержит.


Проверь сам, наколбась OR-ов штук с тысячу, должно быть какое-то ограничение. Можешь и так сделать, никто не говорит, что это работать не будет. Это не самое красивое решение, но если оно тебя устраивает - значит все Ок. "Есть много способов ободрать кошку"(с) непомнюкто. Но ты все равно должен понимать, что если объемы будут расти, то это место у тебя будет узким по производительности.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
На страницу 1 2
Страница 1 из 2

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы