Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как осуществить быструю выборку названий по полю с индентификаторами для этих названий?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: бррррр
Rooner
Отправлено: 20 Августа, 2010 - 17:46:54
Post Id


Посетитель


Покинул форум
Сообщений всего: 291
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




Есть таблица материалов. Есть таблица пользователей. У каждого пользователя в поле mids находятся идентификаторы материалов из таблицы материалов через запятую.
Например у пользователя Vasya поле mids будет выглядеть так: 215,216,245,266,276, 301, 302, 303, 315

На странице пользователя Vasya требуется вывести название всех материалов, которые он добавил, но в таблице пользователей хранятся только идентификаторы материалов. Получается что придется обращаться к БД столько раз сколько и материалов у пользователя? т.е. 9 раз для пользователя Vasya. Есть ли более гибкое и быстрое решение для такой проблемы?
 
 Top
garvey
Отправлено: 20 Августа, 2010 - 17:58:24
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


Помог: 3 раз(а)




Ваша структура БД не соответствует формам нормализации. Если интересует, как сделать правильнее, попросите. Пока отвечу на вашу задачу.

PHP:
скопировать код в буфер обмена
  1. $query = "SELECT `mids` FROM `UsersTable` WHERE `UserName`='Vasya'";
  2. $res = mysql_query($query1);
  3. $mids = mysql_result($res, 0 , 0);
  4. $mids_array = explode(',', $mids);
  5. for ($i = 0; $i < count($mids_array), $i++) {
  6.    $mid = $mids_array[$i];
  7.    $query = "SELECT `MaterialName` FROM `Materilas` WHERE `mid`=" . $mid;
  8.    $res = mysql_query($query);
  9.    $name = mysql_result($res, 0, 0);
  10.    echo $name;
  11. }
 
 Top
Uchkuma
Отправлено: 20 Августа, 2010 - 18:03:21
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




garvey, зачем же так? Вот в одном запросе без цикла:
PHP:
скопировать код в буфер обмена
  1. $query = 'SELECT `MaterialName` FROM `Materilas` WHERE `mid` IN ('.$mids.')';
а дальше mysql_fetch_array(); и пр.
 
 Top
Rooner
Отправлено: 20 Августа, 2010 - 18:09:49
Post Id


Посетитель


Покинул форум
Сообщений всего: 291
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




garvey пишет:
Ваша структура БД не соответствует формам нормализации. Если интересует, как сделать правильнее, попросите. Пока отвечу на вашу задачу.


Спасибо за код, но он итак был понятен. Если вас не затруднит, поясните почему не следует использовать такую структуру, точнее расскажите КАК делать лучше? В частности интересует как лучше привязать материалы к пользователю?
Буду рад ссылкам на подробное описание стандартов проектирования.
(Добавление)
Uchkuma пишет:
garvey, зачем же так? Вот в одном запросе без цикла:
PHP:
скопировать код в буфер обмена
  1. $query = 'SELECT `MaterialName` FROM `Materilas` WHERE `mid` IN ('.$mids.')';
а дальше mysql_fetch_array(); и пр.


Спасибо, ваш метод отлично работает!
 
 Top
alexspb
Отправлено: 20 Августа, 2010 - 19:42:39
Post Id


Посетитель


Покинул форум
Сообщений всего: 260
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Rooner пишет:
Есть таблица материалов. Есть таблица пользователей.

Вам потребуется третья таблица, в которой будут два поля ключевых - айдишники материалов и пользователей соответственно - далее просто строится запрос, связывающий через ключи эти таблицы и выводящий информацию

(Отредактировано автором: 20 Августа, 2010 - 19:43:42)



-----
Хостинг - неограниченно доменов на одну папку
Ajax - отличное введение
 
 Top
Champion Супермодератор
Отправлено: 20 Августа, 2010 - 20:14:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




alexspb пишет:
Вам потребуется третья таблица
Если один материал публикуется не нескольким пользователми, то никакой 3 таблицы не нужно, потому что это один-ко-многим.
Просто в таблице Материалы должно быть поле user_id. Для чего - думаю, что очевидно
 
 Top
JustUserR
Отправлено: 20 Августа, 2010 - 20:59:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Rooner пишет:
Например у пользователя Vasya поле mids будет выглядеть так: 215,216,245,266,276, 301, 302, 303, 315
Как правило нормальная форма хранения данных в реляционных БД требует чтобы отношения были указаны в явном виде по строками - то есь внешние идентификаторы не должны храниться в строковом значении или фиксированном числе столбцов предназначенной для этой цели Тем не менее строковые функции встроенные в SQL позволяет произвести поиск нужного внешенего идентификатора и его выборку - а также модификацию этого значения по необходимости


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB