Перейти к содержанию

Рекомендуемые сообщения

Здравствуйте, помогите. Не сильный в mysql, но нужно выбрать некоторую информацию.

 

Из готовых заказов, те что выполненны нужно взять те что заказали с этого года по сегодня, легко:

SELECT * FROM oc_order WHERE oc_order.order_status_id = 19 AND oc_order.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59'

Например нашло 30 заказов, скажем ид 3000 - 3030, как дальше выбрать все товары, это таблица oc_order_product

 

Через цикл foreach? Или модифицировать 1 запрос вот так?

SELECT * FROM oc_order_product WHERE oc_order_product.order_id in (SELECT oc_order.order_id FROM oc_order WHERE oc_order.order_status_id = 19 AND oc_order.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59')

И потом ище выбрать только те товары у которых производитель Apple (manufacturer_id = 1)

 

В таблице oc_order_product нет колонки manufacturer, но зато она есть в oc_product

 

Как тут быть? Что-то думаю нужно взять JOIN, но как сделать запрос так и не понял)

 

Какими программами вы пользуетесь для построенния таких сложных запросов mysql для разработки своих дополнений?

 

Надеюсь на понимание, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое решение верно?

 

SELECT
order_id.order_id,
product.product_id,
product.model,
product.sku,
product.mpn,
product.manufacturer_id,
product.price,
product.entry_price,
order_product.order_product_id,
order_product.order_id,
order_product.product_id,
order_product.quantity
FROM
oc_order AS order_id ,
oc_order_product AS order_product ,
oc_product AS product
WHERE
order_id.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59' AND
order_product.order_id = order_id.order_id AND
product.manufacturer_id = '1'

С Navicat попробувал, чтото выдало, но незнаю нормальный ли запрос, несколько записей повторяються, логично же заказывали один и тот же товар несколько раз. Как их сгрупировать в один при том чтоб их количество подсчиталось, это можна с помощью SQL, или уже PHP?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
36 минут назад, Eldaeron сказал:

С Navicat попробувал, чтото выдало, но незнаю нормальный ли запрос, несколько записей повторяються, логично же заказывали один и тот же товар несколько раз. Как их сгрупировать в один при том чтоб их количество подсчиталось, это можна с помощью SQL, или уже PHP?

 

GROUP BY для объединения и COUNT (*) для подсчета. И используйте форматированный код, а то так все мимо пройдут, я вот тоже - даже смотреть код не стал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

explain юзайте

 

как вариант

SELECT op.*, p.manufacturer_id
FROM oc_order_product op
LEFT JOIN oc_product p ON (p.product_id = op.product_id)
WHERE p.manufacturer_id = 1
AND op.order_id in (SELECT o.order_id FROM oc_order o WHERE o.order_status_id = 1 AND o.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59')

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
37 минут назад, Eldaeron сказал:

Такое решение верно?

жуть жуткая :ugeek:

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, halfhope сказал:

 

GROUP BY для объединения и COUNT (*) для подсчета. 

Спасибо протестируем.

5 минут назад, AlexDW сказал:

explain юзайте

 

как вариант


SELECT op.*, p.manufacturer_id
FROM oc_order_product op
LEFT JOIN oc_product p ON (p.product_id = op.product_id)
WHERE p.manufacturer_id = 1
AND op.order_id in (SELECT o.order_id FROM oc_order o WHERE o.order_status_id = 1 AND o.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59')

 

Сейчас проверим.

 

1 минуту назад, AlexDW сказал:

жуть жуткая :ugeek:

Та понял:)

 

С навикат сделал вот такой запрос: Сократились заказы с 15к до 39:-D

SELECT
order_id.order_id,
product.product_id,
product.model,
product.sku,
product.mpn,
product.manufacturer_id,
product.price,
product.entry_price,
order_product.order_product_id,
order_product.order_id,
order_product.product_id,
order_product.quantity
FROM
oc_order AS order_id
INNER JOIN oc_order_product AS order_product ON order_id.order_id = order_product.order_id
INNER JOIN oc_product AS product ON order_product.product_id = product.product_id
WHERE
order_id.date_modified BETWEEN '2018-01-01 00:00:00' AND '2018-02-02 23:59:59' AND
order_product.order_id = order_id.order_id AND
product.manufacturer_id = '11' AND
order_id.order_status_id = '19'

Да, видимо нужно ище найти хороший видеоурок по mysql ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

берегите бумагу байты :-D, используйте алиасы

гораздо читабельней и удобней

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Eldaeron сказал:

Да, видимо нужно ище найти хороший видеоурок по mysql 

ві учитесь по видеоурокам?

 

http://www.sql-ex.ru/?Lang=0

Настоятельно рекомендую
Очень хорошо грузит мозги
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 минут назад, AlexDW сказал:

берегите бумагу байты :-D, используйте алиасы

гораздо читабельней и удобней

да, уменьшил. oc_order AS o, oc_order_product AS op, oc_product AS p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно без AS

просто oc_order o

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
11 минут назад, chukcha сказал:

ві учитесь по видеоурокам?

 

http://www.sql-ex.ru/?Lang=0

Настоятельно рекомендую
Очень хорошо грузит мозги
 

Ну не только, но обычно html по zvirec.com начинал, php с lynda.com хороший старт дала, потом практиковался) Правда там mysql затронут был простый был, SELECT * FROM все, конец))) Мне mysql не так сильно надо было на высшем уровне. Обычно в фильтрах тяжелый mysql код, а в остальных модулях SELECT * FROM хватает)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Bistore
      Добрый день помогите выбрать добить модуль личных количественных скидок на каждого пользователя отдельно в ограниченном виде!
      Получается
      1) Можно сравнить количество скидок на товар и количество купленных товаров пользователей(только авторизованные будут) сравнивая по айди товара и купленого товара минусовать количество скидок от купленного товара и выводить есть ли скидочный товар или же нет( или какое количество осталось).
       
      2) Я вывел sql  запросом уже в пользователе количество скидочных товаров минус количество купленного товара по айди ----- и теперь нужно по айди сравнить купленный товар и товар связать и по полю kolichestvo которое получилось в пользователе смотреть Kol=>0 ? или меньше и тд  
      Как лучше сделать?
      Как связать купленный товар(этим пользователем)  и товар на сайте?
      В файле который добавил в этот вопрос есть код корзины где осуществил все (jan - это количество скидок на товар) 
      cart.php
    • От Aky
      Как передать POST параметр через ajax в файл controller модуля OpenCart ?
       
      Есть модуль "latest"  Файл контроллера latest.php, нужно передать туда параметр width через Ajax/Jquery  
       
      Как обратится к этому файлу? 
       
      Как работать с Ajax знаю, как параметры передать знаю, как принять знаю, но как обратится к нужному файлу в OpenCart?
       
      При попытках обращения по "url:' скрипт выдает ошибку  "404 (not found)"
       
      Пробовал вот так:
      url: 'index.php?route=extension/module/latest',  url: 'index.php?route=module/latest',  url: '/catalog/controller/extension/module/latest',   
      Если перейти на прямую по ссылки: "/catalog/controller/extension/module/latest.php"  выдает ошибку HTTP ERROR 500
    • От AndreyRr
      Генерируется много обращений к MySQL - превышаем лимиты на хостинге, и хостер ругается.
       
      С чем может быть связано, и можете посоветует кто-то толькового программиста кто может решить? (сам магазин небольшой, 300 товаров)
    • От 100napb
      Здравствуйте, уважаемые. Пропустим ту часть, в которой обсуждался бы вопрос откуда у Вас могут появиться всякие няшные смайлики. Скажу лишь, что лепить их направо и налево со всяких гаджетов любит каждый, в том числе, оставляя отзывы у Вас на сайте.
       
      Так вот, задался вопросом, как сохранить и не исказить все эти дорогие эмоции. Потому что ОпернКарт с ними не дружит. Для себя нашел следующие решение:
      Прежде всего, текст со смайлами или без них хранится в БД. Для этого данные должны быть в хипстерской кодировке utf8mb4. И сама БД ее должна поддерживать. Не у всех стоят последние версии Mysql, где все это работает не просто из коробки, а по умолчанию. Что бы перевести таблицу на кодировку с эмодзи выполним ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; где table_name заменяем на нужные таблицы. Можно и всю базу так заальтерить, но я чет очканул. Мне хватило таблиц oc_review и oc_comment (привет Markimax). Обновлять версию мускуля не обязательно. Если только он настолько старый, что о такой кодировке даже не знает. В настройках коннекта к БД опенкарта так же сменим кодировку: файл /system/library/db/mysqli.php,  $this->connection->set_charset("utf8mb4"); Вроде бы все... ах да, возможно, нужно менять параметры кодировки в файлах mpdo.php и mysql.php. Я менял. Может быть придется еще рестартануть службы. Под спойлером результат.  
      Может кому пригодиться.
      Ну и вопрос для сведущих: можно было как-то проще\грамотнее это сделать?
    • От Molovka
      Ошибки при установке шаблона, загружал шаблон неделю назад всё было хорошо, взял другой шаблон появилась ошибка

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.