Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вложенные запросы
 
 автор: Хулиган   (28.02.2008 в 01:22)   письмо автору
 
 

Нужна помощь с запросом.
Есть три таблицы
SS_baskets - поля basketID, productID, count
SS_products - поля productID, name, price
SS_order_products - поля productID, orderID, name, price, count

Как правильно (оптимально) выбрать из первой таблицы записи с определенным basketID и на основе этих записей получить name и price из второй таблицы и вкупе с SS_baskets.count занести в третью таблицу?

Пока что ничего кроме как в лоб, не приходит на ум.
$lastID = mysql_insert_id();
// read basket's data
$basketID = $_COOKIE['lastname'].$pass;
$result = mysql_query("SELECT * FROM `SS_baskets` WHERE basketID = '$basketID'") or die(mysql_error());
while ( $row = mysql_fetch_row($result) ){
    $result1 = mysql_query("SELECT name, price FROM `SS_products` WHERE productID = '$row[1]' LIMIT 1") or die(mysql_error());
    if ( $prod = mysql_fetch_row($result1) ){
        mysql_query("INSERT INTO `SS_order_products` VALUES($row[1], $lastID, '$prod[0]', '$prod[1]', '$row[2]' )") or die(mysql_error());
    }
    mysql_free_result($result1);
}


И ещё вопрос, который не дает покоя :)
Не содержит ли приведенный выше код каких - либо подводных камней, связанных с тем, что имея один активный результат запроса ($result), выполяются на его основе другие запросы и освобождаются их результаты ($result1)?

   
 
 автор: KirillKiev   (29.02.2008 в 14:45)   письмо автору
 
   для: Хулиган   (28.02.2008 в 01:22)
 

Есть вариант вообще обойти php в подобных задачах

replace into SS_order_products
select
B.productID as  productID,
(select max(OP.orderID)+1 from SS_order_products) as orderID,
P.name as name,
P.price as price,
B.count as count
from
SS_baskets  as B,
SS_products as P,
SS_order_products as OP
where
B.basketID =' ".$basketID"'
and
P.productID = B.productID  
and
OP.productID  = B.productID 

Подводные камни
первое
в начале стоит replace а не insert
то есть если в таблице SS_order_products уже есть такой primary то он перезапешеться
с другой стороны orderID должен быть auto_increment
то есть можно спокойно вместо конструкции
B.productID as  productID,
(select max(OP.orderID+1 from SS_order_products)) as orderID,

делать просто
'' as orderID

или
null as orderID

подставляется только $basketID из php и все
но нужно проверять...

   
 
 автор: Хулиган   (29.02.2008 в 21:26)   письмо автору
 
   для: KirillKiev   (29.02.2008 в 14:45)
 

Спасибо, попробую разобраться

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования