SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.10.2010 00:28:29

Алексей1984
Участник
Зарегистрирован: 06.04.2010
Сообщений: 5

Организация связей в таблицах

Возникла следующая проблемка по выборке определенной записи из двух таблиц:
таблица 1 (rubriki):
http://s007.radikal.ru/i300/1010/83/dd2c3df85028.jpg
в которой имеется поле id - уникальный идентификатор, по этому id вытаскиваются определенные записи из таблицы
и таблица 2 (gallery):
http://s008.radikal.ru/i304/1010/92/4adbebb17b4e.jpg
где имеются группы фотографий принадлежащие разным товарам из первой таблицы.
Как сделать, чтобы по id первой таблицы можно было вытащить несколько фотографий из второй таблицы, и при изменении или удалении записи с первой таблицы, также удалялись записи и из второй таблицы. При этом разным товарам будет соответствовать разное количество фотографий во второй таблице, а у некоторых и вовсе отсутствовать.
Т.е. как можно организовать связь строки из первой таблицы и столбца из второй таблицы
Заранее спасибо...

Неактивен

 

#2 29.10.2010 01:00:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Организация связей в таблицах

Сделайте во второй таблице столбец rubriki_id, куда будут записываться id из первой таблицы. И добавте внешний ключ.
FAQ №4

Неактивен

 

#3 29.10.2010 07:38:43

Алексей1984
Участник
Зарегистрирован: 06.04.2010
Сообщений: 5

Re: Организация связей в таблицах

Но во второй таблице будет содержаться информация не только по одной галерее, а по многим...
Т.е. получается, что например id с 1 по 6 второй таблицы содержат ссылки на один товар из первой таблицы, а 7 по 10 на другой товар из первой таблицы (с другим id из первой таблицы) и т.д. Другими словами возможно ли вообще такое решение?)

Неактивен

 

#4 29.10.2010 09:10:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Организация связей в таблицах

А что именно вас смущает?
У вас ведь не возникает вопросов по поводу того, что в первой таблице поле categoryname у разных групп id разное.
Или я не правильно вас понял?

Неактивен

 

#5 29.10.2010 10:27:12

Алексей1984
Участник
Зарегистрирован: 06.04.2010
Сообщений: 5

Re: Организация связей в таблицах

Дело в том, что есть страница (предположим view_c) на ней представлена группа товаров, по каждым товаром имеется кнопка - подробнее, оформленная в виде ссылки (<a href='view_p.php?id=%s' title='Подробнее'>Подробнее</a>), где %s - это элемент цикла do...while в функции printf ("<a href='view_p.php?id=%s' title='Подробнее'>Подробнее</a>",$myarrayres_rubrika["id"]), вытаскивающий из таблицы rubriki информацию о товаре по этому id на новой странице  (предположим view_p). Но у некоторых товаров (не всех) имеется в наличии еще и галерея, тоже на странице view_p, записи по которой представлены в таблице gallery. Этот момент я и не могу понять, т.е. при переходе со страницы view_c на страницу view_p, выборка из таблицы rubriki проходит на ура, т.е. информация отображается только для того товара, которому соответствует id в ссылке - Подробнее, а информация о галерее отображается для всех товаров одинаковая. Мне нужно сформировать такой запрос, чтобы при нажатии на ссылку открывалась страница с тем товаром, котором соответствует id в ссылке и если есть галерея, заданная в таблице gallery к этому товару, то выбирались именно те элементы этой таблицы, которые соответствуют товару. Как это сделать я никак не могу понятьsmile
////////////////////////////////////////////////
Код (страница view_c):
.......
<div id="hellomysite">
<h2>
<?php echo $myarrayres['text']; ?>
</h2>
</div>
<div class="tovar">
<span id="tovar2">               
<!--соединение с базой для вывода элементов по рубрике товара-->
<?php        
/*делаем выборку из базы данных*/
$res_rubrika = mysql_query("SELECT id,view,cena,categorynalichie,data,mini_image,big_image,title,vosrast
FROM rubriki WHERE categoryname='$methody'",$databasic);
/*проверка №1 - проверяем на правильность вывод данных в переменную $res_rubrika*/
if (!$res_rubrika)
{
echo "<p>Обращение к базе данных не состоялось. Оповестите об этом администратора по email:
..... <br />
<strong>Код ошибки:</strong></p>";
exit(mysql_error());
}                       
/*проверка №2 - проверяем были ли данные вынесены из базы данных, т.е. существует хотя бы одно
значение в $res_rubrika*/
if (mysql_num_rows($res_rubrika) > 0)
{
/*вытаскиваем результаты запроса в переменную массив*/
$myarrayres_rubrika = mysql_fetch_array($res_rubrika);
/*открываем цикл для извлечения данных из таблицы базы данных*/
do
{
/*Маленькая проверка товара на наличие*/
if($myarrayres_rubrika["categorynalichie"] == 2)
{   
$nalichie = "<br /><span id='tovar'>*Товар временно отсутствует*</span>";
}
printf (
"<table border='0' cellspacing='0' cellpadding='0' class='blockstylecentertwo' valign='top'>
<tr>
<td class='blockstyle1'><img src='image/topleftcentertwo.gif' width='10' height='10' /></td>
<td class='blockstyle2'><img src='image/toprightcentertwo.gif' width='10' height='10' /></td>
</tr>
<tr>
<td colspan='2' class='centerminiblock'><span id='name_tovar'>%s</span></td>
</tr>
<tr>
<td colspan='2' class='centerminiblockline'></td>
</tr>
<tr>
<td colspan='2' class='centerminiimage'>
<img src='%s' class='newtovarimage' />
</td>
</tr>
<tr>
<td colspan='2' class='zenabox'><span class='zena_tovara'>Цена %s рублей</span>$nalichie</td>
</tr>
<tr class='zenabox' align='center'>
<td>
<div id='sub4'>
<a href='sakas.php' title='Заказать'>
Заказать
</a>
</div>
</td>
<td>
<div id='sub5'>
<a href='view_p.php?id=%s' title='Подробнее'>
Подробнее
</a>
</div>
</td>
</tr>                 
<tr valign='bottom' class='zenabox'>
<td height='10' class='blockstyle1'><img src='image/bottomleftcentertwo.gif' width='10'
height='10' /></td>
<td class='blockstyle2'><img src='image/bottomrightcentertwo.gif' width='10' height='10'/></td>
</tr>
</table>", $myarrayres_rubrika["title"],$myarrayres_rubrika["mini_image"],
$myarrayres_rubrika["cena"],$myarrayres_rubrika["id"]);
}
while ($myarrayres_rubrika = mysql_fetch_array($res_rubrika));               
}
else
{
echo "<p id='privets'>По данной рубрике нет ни одной записи</p>";                   
}
?>
.......
////////////////////////////////////////////////
фрагмент кода (страница view_p):
.......
if(isset($_GET['id']))
{
$id = $_GET['id'];
}
/*защита от ввода в строке браузера ссылки без присвоенного значения переменной $methody*/
if(!isset($id))
{
$id = 1;
}
/*делаем выборку из базы данных*/
$res = mysql_query("SELECT * FROM rubriki WHERE id='$id'",$databasic);
/*проверка №1 - проверяем на правильность вывод данных в переменную $res*/
if (!$res)
{
echo "<p>Обращение к базе данных не состоялось. Оповестите об этом администратора по email: ..... <br />
<strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
/*проверка №2 - проверяем были ли данные вынесены из базы данных, т.е. существует хотя бы одно значение в $res*/
if (mysql_num_rows($res) > 0)
{
/*вытаскиваем результаты запроса в переменную массив*/
$myarrayres = mysql_fetch_array($res);
/*реализуем счетчик просмотров товара*/
$new_view = $myarrayres["view"]    + 1;
mysql_query("UPDATE rubriki SET view='$new_view' WHERE id='$id'",$databasic);               
}
else
{
echo "<p>Данные из базы по неизвестной причине не извлекаются. Оповестите об этом администратора по
email: ....</p>";
exit();                   
}           
.......................................................
<?php
/*Маленькая проверка товара на наличие*/
if($myarrayres["categorynalichie"] == 2)
{   
$nalichie = "<span id='tovar2'>*Товар временно отсутствует*</span>";                            
printf("
<img src='%s' class='podrobnee_image'>
<p class='podrobnee_opisanie'>Описание товара:</p>
<p class='podrobnee_block'>
Дата добавления товара: %s<br />
Количество просмотров: %s
</p>
<div class='podrobnee_text'>%s</div>
<div align='center'>
<div class='podrobnee_cena'>Цена товара %s рублей</div>
$nalichie
<div id='sub7'>
<a href='soobshenie.php' title='Сообщить о доставке по электронной почте'>Заказать</a>
</div>
</div>",$myarrayres["big_image"],$myarrayres["data"],$myarrayres["view"],$myarrayres["text"],
$myarrayres["cena"]);
}
else
{                        
printf("
<img src='%s' class='podrobnee_image'>
<p class='podrobnee_opisanie'>Описание товара:</p>
<p class='podrobnee_block'>
Дата добавления товара: %s<br />
Количество просмотров: %s
</p>
<div class='podrobnee_text'>%s</div>
$nalichie
<div align='center'>
<div class='podrobnee_cena'>Цена товара %s рублей</div>
<div id='sub6'><a href='sakas.php' title='Заказать'>Заказать</a></div>
</div>",$myarrayres["big_image"],$myarrayres["data"],$myarrayres["view"],$myarrayres["text"],
$myarrayres["cena"]);
}   
?>
.......................................................
<?php
/*делаем выборку из базы данных*/
$res_gallery = mysql_query("SELECT * FROM gallery",$databasic);
/*проверка №1 - проверяем на правильность вывод данных в переменную $res_gallery*/
if (!$res_gallery)
{
echo "<p>Обращение к базе данных не состоялось. Оповестите об этом администратора по email: Lexluterking@ya.ru <br />
<strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
/*проверка №2 - проверяем были ли данные вынесены из базы данных, т.е. существует хотя бы одно значение в $res*/
if (mysql_num_rows($res_gallery) > 0)
{
/*вытаскиваем результаты запроса в переменную массив*/
$myarrayres_gallery = mysql_fetch_array($res_gallery);           
}
else
{
echo "<p>Данные из базы по неизвестной причине не извлекаются. Оповестите об этом администратора по
email: .....</p>";
exit();                   
}                                    
do
{
print_f("<li>%s</li>",$myarrayres_gallery["gallery_sapisi"])
}
while ()
?>
..............

Неактивен

 

#6 29.10.2010 15:35:25

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Организация связей в таблицах

1) добавляем в таблицу галереи ещё одну колонку, например product_id. В эту колонку пишем id товара, которому принадлежит фотография.
|id|product_id|gallery_sapisi|
----------------------------
|1|  2           |sdkfjsdkf.jpg|
|2|  2           |ashdjhsjdj.jpg|
|3|  4           |sdfksdjf.jpg|
|4|  4           |sdjfksdhfhj.jpg|
....
В этом случае у нас две фотки принадлежит товару с ИД = 2 и две товару с ИД = 4

Далее, когда заходим посмотреть подробную информацию о конкретном товаре, выбираем для него все фотки таким запросом:
SELECT gallery_sapisi FROM gallery WHERE product_id = <ид_товара>
if (mysql_num_rows($result) > 0)
{
  выводим циклом на экран галлерею.
}

3) ставим индекс на поле product_id в таблице gallery, заходим в связи и связываем с таблицей товаров и полем ИД (products.id) - (ON DELETE CASCADE, ON UPDATE CASCADE). В этом случае при удалении товара удалятся все записи где product_id будет равен ИД товара. Важно! обе таблицы должны быть InnoDB.
4) Прежде чем удалить какой-то товар, сначала выбираем название всех фоток из галереи, далее циклом удаляем файлы фоток: if(is_file(файл)) unlink(файл)
после этого DELETE FROM products WHERE id = <ид_товара> LIMIT 1

Вот наверное и всё.

Неактивен

 

#7 29.10.2010 15:41:42

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Организация связей в таблицах

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

Неактивен

 

#8 29.10.2010 21:37:35

Алексей1984
Участник
Зарегистрирован: 06.04.2010
Сообщений: 5

Re: Организация связей в таблицах

Ok, Спасибочки. А то совсем заморочился... Наверное пора прекращать работать по ночам smile

Неактивен

 

#9 04.01.2012 20:08:55

jk_limited
Участник
Зарегистрирован: 04.01.2012
Сообщений: 1

Re: Организация связей в таблицах

не получаться сделать связь между таблицами пожалуйста помогите:

$result4 = mysql_query("CREATE TABLE `rub` (
`rub_id` int(11) NOT NULL auto_increment,
`rub_name` varchar(15) NOT NULL,
PRIMARY KEY `rub_id` (rub_id)
)",$msconnect) or die('Таблица rub не создана!<br>');
if($result4=="1") echo 'Таблица rub создана!<br>';

$result = mysql_query("CREATE TABLE `nedviz_ichu_companiona`(
`id` int(11)            NOT NULL auto_increment PRIMARY KEY,
`shews` text             NOT NULL,
`users_id` int(11)        NOT NULL,
`contact_id` int(11)    NOT NULL,
`region_id` int(11)        NOT NULL,
`town_id` int(11)        NOT NULL,
`date` date             NOT NULL,
`rub_id` int(11)        NOT NULL,
`oplata_id` int(11)        NOT NULL,
`del` int(2)             NOT NULL,
FOREIGN KEY (`rub_id`)        REFERENCES `rub`(`rub_id`)
)",$msconnect) or die('Таблица не создана!<br>');   
if($result=="1") echo 'Таблица создана!<br>';

Неактивен

 

#10 05.01.2012 06:12:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Организация связей в таблицах

Уточните о какой связи идет речь. Если о невозможности создать внешний ключ, то убедитесь, что таблицы innodb и если да, то приводите текст ошибки и результат выполнения show innodb status сразу после получения ошибки.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson