Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Subselect w jednej tabeli, Wyświetlić listę produktów z sumowaną ilością towaru
bojak
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.02.2016

Ostrzeżenie: (0%)
-----


Witam.

Na wstępie powiem, że do tej pory jakość sobie radziłem z różnymi problemami, ale.. brak mi pomysłu i trochę czas nagli (jest wiele osób, które posiadają ten sam sklep (Shoper lub ClikShop) i ten sam problem, a aktualizacja z poprawką tego szybko pewnie nie nadejdzie znając życie). Nie liczę na gotowe rozwiązanie a chociaż na pokazanie mi drogi do rozwiązania.

Mam sklep internetowy ale niestety nie aktualizują się stany magazynowe produktu głównego na podstawie wariantów. chciałbym:
1. uzyskać listę produktów, które należy zaktualizować - lista muszę wyeksportować do pliku tylko sam product_id w przypadku gdy suma magazynowa wariantów jest różna od stanu magazynowego produktu głównego
2. aktualizacja stanu magazynowego na podstawie stanu magazynowego wariantów

Do rzeczy. Struktura tabeli (część).
  1. mysql> SELECT `product_id` , `stock`, extended FROM products_stock;


+------------+-------+----------+
| product_id | stock | extended |
+------------+-------+----------+
| 110 | 7 | 0 |
| 110 | 1 | 1 |
| 110 | 1 | 1 |
| 112 | 5 | 0 |
| 112 | 0 | 1 |
| 113 | 9 | 0 |
| 113 | 2 | 1 |
| 113 | 1 | 1 |
| 113 | 2 | 1 |
| 113 | 2 | 1 |
| 115 | 4 | 0 |
| 115 | 1 | 1 |
| 115 | 1 | 1 |
| 115 | 2 | 1 |

extended =0 - produkt główny, 1-wariant produktu

wymyśliłem zapytanie (Osobne zapytania działają, ale nie wiem jak je połączyć w całość):
  1. SELECT `product_id`,stock,(SELECT sum(stock) FROM products_stock WHERE extended=1 GROUP BY product_id)
  2. FROM products_stock
  3. WHERE extended=0
  4. GROUP BY product_id


chciałem chociaż uzyskać wynik produck_id, stock (główny), sum(stock - wariantów)

ale było by to zbyt piękne by się udało - wynik wyszedł spodziewany - subquery returns more then 1 row.
wynika to z tego, że nie wszystkie produkty główne mają warianty (czyli są product_id gdzie brak jest extended=1)

Rozważałem też wynik z
  1. SELECT `product_id`,sum(stock) FROM products_stock WHERE extended=1 GROUP BY product_id

zrobić jako tabelę tymczasową (macierz), ale zależy mi na jak najprostszym rozwiązaniu - skrypt będzie uruchamiany co 15-30 minut

Co podobnego już robiłem, ale jak pewne rzeczy robi się raz na rok to się tego nie pamięta.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bojak
post
Post #2





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.02.2016

Ostrzeżenie: (0%)
-----


Mam pytanie jeszcze z innej beczki.

napisałem zapytanie które tworzy plik ze ścieżką do usuwania plików (skrypt basch)
  1. SELECT concat('find /home/bojak/domains/image-collection.pl/public_html/environment/cache/objects/ -type f -name "zend_cache---productStock_',stock_id,'" -exec rm {} \\;')


problem dotyczy ostatnich znaków "\\". prawidłowa komenda to
  1. -exec rm {} \;
. Problem jest taki, że jak na końcu polecenia wpiszę jeden \ to baza wywala błąd, skolei jak piszę \\ to w PHPMyadmin widzę tylko jedno \, natomiast jak wysyłam to do pliku to otrzymuję też \\. potem muszę użyć dodatkowego polecenia
  1. sed -i 's/\\;/\; /g' 1-wariant-zero.out.sh
do usuwania jednego \.

czy jest jakieś rozwiązanie bez dodatkowych poleceń tak by w pliku zapisał się \. Próbowałem zastąpić \ poleceniem char(92). Ale jest tak samo w PHPmyadmin jest \ a w pliku \\

Cytat(trueblue @ 17.02.2016, 10:35:51 ) *
Pod warunkiem, że główny jest tylko jeden:
  1. SELECT product_id, SUM(IF(extended=0,stock,0)) AS main, SUM(IF(extended=1,stock,0)) AS extended
  2. FROM product
  3. GROUP BY product_id
  4. HAVING main<>extended


Jest pięknie napisane, ale wynik nie uwzględnia produktów głównych, które nie mają wariantów - a niestety takie tez bywają.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 20:06