SQL Запросы из АДА

akd

dive now, work later
Команда форума
Скорее, дожили что, люди боятся узнать о SQL чуть более чем select * from table.
 

Redjik

Джедай-мастер
Тренируюсь с SQL, вот совсем ИМХО НЕ адоввый запрос, заняло минут 5-10, ибо опыта порой не хватает
PHP:
UPDATE ordered_products SET count = IF(:count < (SELECT in_stock FROM products WHERE id=:product_id),:count,(SELECT in_stock FROM products WHERE id=:product_id))
                WHERE product_id = (SELECT id FROM products WHERE id=:product_id)
                AND order_id = (SELECT id FROM `order` WHERE cookie_id = :cookie)
и то накосячил - два раза вложенный SELECT in_stock FROM products WHERE id=:product_id - почему-то не получилось alias привязать, само-собой все это обернуто в try catch
 

Breeze

goshogun
Команда форума
Партнер клуба
два раза вложенный SELECT in_stock FROM products WHERE id=:product_id - почему-то не получилось alias привязать, само-собой все это обернуто в try catch
+1 запрос к той же таблице.

Имхо проще сделать SELECT id, in_stock FROM products WHERE id=:product_id отдельным запросом, да и во вложенном селекте по куке смысла нет.
На условно больших объемах с вложенными запросами уже страшно работать, особенно с MyISAM.

Если уж хочется один запрос, то делай процедуру какую-нибудь.

ЗЫ: это ты так атомарную транзакцию делаешь что ли? :)
 

Redjik

Джедай-мастер
Breeze
Это увеличение количества товара в корзине.

Например человек кинул носки в корзину, а потом понял, что ему нужно 80 пар.

Заказ по куке запоминается, у заказа has_many заказанных товаров (order_id,product_id,count).

Этим запросом меняется count для товара, который лежит в корзине.
Если count больше чем товаров in_stock, то ставиться макс значение.

Вариант был "рабочим", так как в итоге все-равно нужно было дополнительный select на in_stock товаров - для вывода пользователю.
 

Redjik

Джедай-мастер
сейчас такой остался
PHP:
       UPDATE ordered_products SET count = :count
                WHERE product_id = (SELECT id FROM products WHERE id=:product_id)
                AND order_id = (SELECT id FROM `order` WHERE cookie_id = :cookie)
а перед этим
PHP:
SELECT in_stock FROM products WHERE id=:product_id
ага, так и есть.
 

Redjik

Джедай-мастер
проверка - существует ли товар, чтобы в catch запрос падал, если нет...

хотя сейчас понимаю, что глупо, ибо FK стоит, и запрос в любом случае будет в catch падать, если товара нет... спасибо.
 

Breeze

goshogun
Команда форума
Партнер клуба
сейчас такой остался
PHP:
       UPDATE ordered_products SET count = :count
                WHERE product_id = (SELECT id FROM products WHERE id=:product_id)
                AND order_id = (SELECT id FROM `order` WHERE cookie_id = :cookie)
а перед этим
PHP:
SELECT in_stock FROM products WHERE id=:product_id
ага, так и есть.
Им же проще и id выбрать.

А in_stock ты апдейтишь после кидания в заказ?
 

Redjik

Джедай-мастер
тогда пользователь сможет чужой заказ подменять в процессе оформления заказа, принкрементив или декрементив order_id
 

Redjik

Джедай-мастер
Им же проще и id выбрать.
Эм, это не экономия на спичках?

join vs вложеный SELECT
А in_stock ты апдейтишь после кидания в заказ?
Ну навряд ли он поменяется по ходу заказа, сначала хранил это в сессии, теперь вот решил из бд брать.
 

Breeze

goshogun
Команда форума
Партнер клуба
PHP:
SELECT id as order_id FROM `order` WHERE cookie_id = :cookie
SELECT id as product_id, in_stock FROM products WHERE id=:product_id /* хотя вот тут даже id выбирать необязательно, если in_stock выбран, то :product_id в апдейт итак пойдет */
UPDATE ordered_products SET count = :count WHERE order_id = :order_id AND product_id = :product_id
что может быть проще и быстрее двух селектов по primary key и одного апдейта файтически по unique key
 

Breeze

goshogun
Команда форума
Партнер клуба
join vs вложеный SELECT.
простой select vs вложенный

а про апдейт in_stock я к тому, что закажет у тебя посетитель 80 пар носков из 80, а потом придет еще один через секунду и захочет заказать столько же и in_stock ему позволит это.
 

Redjik

Джедай-мастер
простой select vs вложенный

а про апдейт in_stock я к тому, что закажет у тебя посетитель 80 пар носков из 80, а потом придет еще один через секунду и захочет заказать столько же и in_stock ему позволит это.
Нет, кто первый встал, того и тапки =)
 

Redjik

Джедай-мастер
Спасибо, что указали на ошибки, но навряд ли буду переделывать, нагрузки на этот сайт, не будет никгода - специфика, поэтому не страшно было потренироваться в запросах.

Опыт все же какой-никакой получил. =)
 

Redjik

Джедай-мастер
Breeze
Chushkin

Кстати! Может посоветуете ресурс с задачками по SQL синтаксису, различные хитрые выборки + встроенные функции. Чтение книг + мануала без практики немного вгоняет в грусть =))))
 

Roosso

Новичок
Прошло 7 лет кажется как я поднял эту тему...

Я не пугался LEFT JOIN / INNER JOIN и прочего... И их приходится использовать часто, никуда тут уже не деться, особенно в кем то спроектированных БД. Но я все равно по прежнему стараюсь проектировать БД и запросы к ней, что бы обходиться минимальными запросами...

А про вычисления в запросах я вообще молчу. Всегда стараюсь обойтись без них, использую только в крайних случаях.

Хотя я конечно понимаю, что время идет. Технологии развиваются... Но MySQL как была тупой... Так и остается тупой. :)
 

AnrDaemon

Продвинутый новичок
Кто бы что там говорил.
Попробуйте в postgres настроить caseless поиск по отдельно взятой колонке.
В "тупом" MySQL это делается одной строкой.
 
Сверху