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%)
-----


Jest bardzo blisko - będę musiał poprawić

dokładniej to potrzebuję samą listę product_ID gdy IlośćGłównego<>Iloscwariantów -potrzebna do eksportu do pliku i wykorzystane będzie w skrypcie sh który jest już gotowy
a potem muszę zrobić aktualizację ilośćGłówna na podstawie IlośćWariantów

Wrócę z pracy wieczorem to będę przy tym siedział.

Bardzo dziękuję.

Siedzę od 1,5h no i mam dumam jak rozwiązać problem z dodaniem jeszcze jednego warunku.


  1. SELECT product_id,stock,extended FROM `products_stock` LIMIT 10

product_id | stock | extended
110 | 7 | 0
110 | 1 | 1
110 | 1 | 1
112 | 1 | 0
112 | 0 | 1
113 | 7 | 0
113 | 1 | 1
113 | 2 | 1
113 | 2 | 1
113 | 2 | 1

i teraz chciałbym aby sprawdzić czy x.stok gdzie x.extended=0 jest równy/różny sum(x1.stock) gdzie x1.extended=1. Biorąc sytuację że chciałbym mieć tylko product_ID gdy x.stock<>sum(x1.stock) to tabela powinna wyglądać tak

product_id | IloscGlownego | IloscWariantow
110 | 7 | 2
112 | 1 | 0


113 - nie wyświetla się bo jest ok - IloscGlownego=7 i suma IloscWariantow =7

Podany kod działa dobrze, ale tylko gdy wyświetlamy. Próbowałem na różne kombinacje ale niestety nie wychodzi mi. Dopisanie warunku
  1. AND 'IloscGlownego'<>'IloscWariantow'

niestety nie zmienia nic. Próbowałem z wykorzystaniem HAVING.i też nic
  1. SELECT x.product_id, x.stock AS IloscGlownego ,sum(x1.stock) AS IloscWariantow
  2. FROM products_stock x
  3. RIGHT JOIN products_stock x1
  4. ON x.product_id=x1.product_id && x1.extended=1
  5. WHERE x.extended=0
  6. GROUP BY product_id
  7. HAVING 'x.stock'<>(SELECT sum('x1.stock') FROM products_stock x1 WHERE x1.extended=1 GROUP BY product_id LIMIT 1)

Otrzymuję nic

Czy może jakaś sugestia (IMG:style_emoticons/default/questionmark.gif)

a jednak działa z having - inaczej zapisane i działa
  1. SELECT
  2. x.product_id,
  3. x.stock AS IloscGlownego,
  4. sum(x1.stock) AS IloscWariantow
  5.  
  6. FROM products_stock x
  7. LEFT JOIN products_stock x1 ON
  8. x.product_id = x1.product_id && x1.`extended` = 1
  9. WHERE x.`extended` = 0
  10. GROUP BY product_id
  11. HAVING x.stock<>sum(x1.stock)


teraz tylko kod do aktualizacji IloscGlownego na podstawie IloscWariantow.
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: 12.10.2025 - 01:35