PrestaShop SQL: τα joins που χρειάζεσαι για χρήσιμα catalogue reports
Τα περισσότερα χρήσιμα PrestaShop reports δεν βρίσκονται σε έναν πίνακα.
Η δυσκολία δεν είναι να γράψεις ένα τεράστιο query. Είναι να ξέρεις ποιο entity κατέχει κάθε δεδομένο και να κάνεις joins χωρίς να δημιουργείς duplicates.
1. Ξεκίνα από το row grain
Πριν γράψεις SQL, όρισε τι αντιπροσωπεύει μία γραμμή του αποτελέσματος.
ONE ROW PER PRODUCTή:
ONE ROW PER COMBINATIONΑν δεν το ορίσεις, κάθε επόμενο join μπορεί να πολλαπλασιάσει τις γραμμές.
2. Product + language
SELECT
p.id_product,
p.reference,
pl.name
FROM ps_product p
INNER JOIN ps_product_lang pl
ON pl.id_product = p.id_product
AND pl.id_lang = 1
AND pl.id_shop = 1;Τα id_lang και id_shop είναι μέρος του dataset specification.
3. Πρόσθεσε stock
Για simple products:
LEFT JOIN ps_stock_available sa
ON sa.id_product = p.id_product
AND sa.id_product_attribute = 0Για variants, το grain πρέπει να γίνει combination-level.
4. Default category
Ένα product μπορεί να ανήκει σε πολλές categories. Αν χρειάζεσαι μόνο τη default category, μην κάνεις join σε όλες τις associations.
LEFT JOIN ps_category_lang cl
ON cl.id_category = p.id_category_default
AND cl.id_lang = 1
AND cl.id_shop = 15. Manufacturer
LEFT JOIN ps_manufacturer m
ON m.id_manufacturer = p.id_manufacturer6. Category count χωρίς duplicate rows
SELECT
p.id_product,
p.reference,
COUNT(DISTINCT cp.id_category) AS category_count
FROM ps_product p
LEFT JOIN ps_category_product cp
ON cp.id_product = p.id_product
GROUP BY p.id_product, p.reference;7. Οι εικόνες είναι επίσης one-to-many
Ένα direct join στο ps_image μπορεί να δώσει μία γραμμή ανά image. Αποφάσισε αν θέλεις cover, image count ή ξεχωριστή γραμμή για κάθε εικόνα.
8. Practical product report
SELECT
p.id_product,
p.reference,
pl.name,
m.name AS manufacturer,
cl.name AS default_category,
sa.quantity,
p.price,
p.active
FROM ps_product p
INNER JOIN ps_product_lang pl
ON pl.id_product = p.id_product
AND pl.id_lang = 1
AND pl.id_shop = 1
LEFT JOIN ps_manufacturer m
ON m.id_manufacturer = p.id_manufacturer
LEFT JOIN ps_category_lang cl
ON cl.id_category = p.id_category_default
AND cl.id_lang = 1
AND cl.id_shop = 1
LEFT JOIN ps_stock_available sa
ON sa.id_product = p.id_product
AND sa.id_product_attribute = 0
ORDER BY p.id_product DESC;Note
Το παράδειγμα είναι product-level. Products με combinations χρειάζονται variant-level stock model.
9. Εντόπισε accidental row multiplication
Σύγκρινε COUNT(*) με COUNT(DISTINCT p.id_product). Αν διαφέρουν χωρίς να το περιμένεις, κάποιο join άλλαξε το grain.
10. Χτίσε reports σε layers
BASE ENTITY
↓
LANGUAGE
↓
SHOP CONTEXT
↓
ONE-TO-ONE DATA
↓
ONE-TO-MANY DATA
↓
AGGREGATE
↓
VERIFY ROW COUNTΤο καλό SQL reporting είναι dataset design. Όταν το grain και το context είναι ξεκάθαρα, το query γίνεται πιο εύκολο να ελεγχθεί και να επαναχρησιμοποιηθεί.
Πού να συνεχίσεις
Ξεκίνα από τα αποθηκευμένα SQL Manager checks όταν χρειάζεσαι focused audit και προώθησε μόνο δοκιμασμένα queries σε reports. Για pricing datasets, πρόσθεσε τα context rules από τον οδηγό Specific Prices, αντί να θεωρήσεις το product.price τελική απάντηση.