Μετάβαση στο περιεχόμενο
Πίσω στα Άρθρα

PrestaShop SQL: τα joins που χρειάζεσαι για χρήσιμα catalogue reports

Catalogue reporting & data exports
SQL
SELECT
p.id_product,
p.reference,
sa.quantity
FROM ps_product p
JOIN ps_stock_available sa
ON sa.id_product = p.id_product
WHERE p.active = 1;
SQL Manager
Intermediate
PrestaHacks 3 min read

Τα περισσότερα χρήσιμα PrestaShop reports δεν βρίσκονται σε έναν πίνακα.

Η δυσκολία δεν είναι να γράψεις ένα τεράστιο query. Είναι να ξέρεις ποιο entity κατέχει κάθε δεδομένο και να κάνεις joins χωρίς να δημιουργείς duplicates.

1. Ξεκίνα από το row grain

Πριν γράψεις SQL, όρισε τι αντιπροσωπεύει μία γραμμή του αποτελέσματος.

TEXT
ONE ROW PER PRODUCT

ή:

TEXT
ONE ROW PER COMBINATION

Αν δεν το ορίσεις, κάθε επόμενο join μπορεί να πολλαπλασιάσει τις γραμμές.

2. Product + language

SQL
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:

SQL
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.

SQL
LEFT JOIN ps_category_lang cl
    ON cl.id_category = p.id_category_default
    AND cl.id_lang = 1
    AND cl.id_shop = 1

5. Manufacturer

SQL
LEFT JOIN ps_manufacturer m
    ON m.id_manufacturer = p.id_manufacturer

6. Category count χωρίς duplicate rows

SQL
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

SQL
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

TEXT
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 τελική απάντηση.

ΜΕΙΝΕ ΕΝΗΜΕΡΩΜΕΝΟΣ

Πρακτικά PrestaShop hacks κατευθείαν στο inbox σου.

ΑΝΕΝΕΡΓΟ