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

PrestaShop SQL Manager: 15 χρήσιμα queries που αξίζει να έχεις αποθηκευμένα

Catalogue audit & product data
SQL
// active products with current stock
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 7 min read

Δεν χρειάζεται κάθε έλεγχος στον κατάλογο ενός PrestaShop να γίνεται με export, module ή custom script.

Για πολλές καθημερινές εργασίες, ένα σωστό SELECT αρκεί για να εντοπίσεις προϊόντα με ελλιπή δεδομένα, duplicate references, μηδενικό stock, combinations χωρίς SKU ή records που χρειάζονται έλεγχο πριν από import, export ή integration.

Σε αυτό το άρθρο συγκεντρώνουμε 15 πρακτικά SQL queries που αξίζει να έχεις στο toolbox σου.

Note

Τα παραδείγματα χρησιμοποιούν database prefix ps_, id_lang = 1 και id_shop = 1. Προσάρμοσέ τα στις πραγματικές τιμές του shop σου.

Warning

Όλα τα παραδείγματα είναι SELECT. Μην εκτελείς UPDATE ή DELETE σε production database χωρίς verified backup και rollback plan.

Πού θα τα εκτελέσεις

Μπορείς να χρησιμοποιήσεις τον SQL Manager του PrestaShop ή database client όπως phpMyAdmin/Adminer.

Screenshot Placeholder 01 MEDIA TO ADD

PrestaShop Back Office → SQL Manager. Να φαίνεται το σημείο δημιουργίας νέου SQL query.

1. Όλα τα ενεργά προϊόντα

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    p.price
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
WHERE p.active = 1
ORDER BY p.id_product DESC;

Τι επιστρέφει

  • Product ID
  • Reference / SKU
  • Product name
  • Base price

Αποτελεί καλό starting point για exports, catalogue audits και μεγαλύτερα reports.

2. Ενεργά προϊόντα χωρίς reference

SQL
SELECT
    p.id_product,
    pl.name,
    p.reference
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
WHERE p.active = 1
  AND (p.reference IS NULL OR TRIM(p.reference) = '')
ORDER BY pl.name;

Το reference είναι ιδιαίτερα χρήσιμο όταν το PrestaShop συνδέεται με ERP, supplier files, marketplaces ή spreadsheets.

3. Duplicate product references

SQL
SELECT
    reference,
    COUNT(*) AS total_products
FROM ps_product
WHERE reference IS NOT NULL
  AND TRIM(reference) <> ''
GROUP BY reference
HAVING COUNT(*) > 1
ORDER BY total_products DESC, reference;

Tip

Τρέξε αυτό το query πριν από integrations που χρησιμοποιούν το SKU/reference ως external identifier.

4. Products χωρίς EAN-13

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    p.ean13
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
WHERE p.active = 1
  AND (p.ean13 IS NULL OR TRIM(p.ean13) = '')
ORDER BY pl.name;

Ένα προϊόν χωρίς EAN δεν είναι απαραίτητα λάθος. Το query λειτουργεί ως data-quality report.

5. Products χωρίς εικόνα

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
LEFT JOIN ps_image i
    ON i.id_product = p.id_product
WHERE p.active = 1
GROUP BY
    p.id_product,
    p.reference,
    pl.name
HAVING COUNT(i.id_image) = 0
ORDER BY pl.name;

Χρήσιμο πριν από catalogue launch, marketplace feed, migration ή visual QA.

6. Products με πολύ λίγες category associations

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    COUNT(cp.id_category) AS category_count
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_category_product cp
    ON cp.id_product = p.id_product
WHERE p.active = 1
GROUP BY
    p.id_product,
    p.reference,
    pl.name
HAVING COUNT(cp.id_category) <= 1
ORDER BY category_count, pl.name;

Το αποτέλεσμα χρειάζεται ερμηνεία ανάλογα με τη category architecture του shop.

7. Simple products με μηδενικό stock

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    sa.quantity
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
INNER JOIN ps_stock_available sa
    ON sa.id_product = p.id_product
    AND sa.id_product_attribute = 0
WHERE p.active = 1
  AND sa.quantity = 0
ORDER BY pl.name;

Το διαθέσιμο stock διαβάζεται από το ps_stock_available.

8. Products με αρνητικό stock

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    sa.quantity
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
INNER JOIN ps_stock_available sa
    ON sa.id_product = p.id_product
    AND sa.id_product_attribute = 0
WHERE sa.quantity < 0
ORDER BY sa.quantity ASC;

Χρήσιμο για stock audit, overselling investigation και ERP sync checks.

9. Combinations χωρίς reference

SQL
SELECT
    pa.id_product_attribute,
    pa.id_product,
    pl.name AS product_name,
    pa.reference
FROM ps_product_attribute pa
INNER JOIN ps_product_lang pl
    ON pl.id_product = pa.id_product
    AND pl.id_lang = 1
    AND pl.id_shop = 1
WHERE pa.reference IS NULL
   OR TRIM(pa.reference) = ''
ORDER BY pl.name, pa.id_product_attribute;

Σε catalogues με variants ο έλεγχος μόνο του parent ps_product.reference δεν αρκεί.

10. Combinations με μηδενικό ή αρνητικό stock

SQL
SELECT
    p.id_product,
    pl.name AS product_name,
    pa.id_product_attribute,
    pa.reference,
    sa.quantity
FROM ps_product_attribute pa
INNER JOIN ps_product p
    ON p.id_product = pa.id_product
INNER JOIN ps_product_lang pl
    ON pl.id_product = p.id_product
    AND pl.id_lang = 1
    AND pl.id_shop = 1
INNER JOIN ps_stock_available sa
    ON sa.id_product = pa.id_product
    AND sa.id_product_attribute = pa.id_product_attribute
WHERE sa.quantity <= 0
ORDER BY sa.quantity ASC, pl.name;

11. Products χωρίς description

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
WHERE p.active = 1
  AND (pl.description IS NULL OR TRIM(pl.description) = '')
ORDER BY pl.name;

12. Products χωρίς meta title

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    pl.meta_title
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
WHERE p.active = 1
  AND (pl.meta_title IS NULL OR TRIM(pl.meta_title) = '')
ORDER BY pl.name;

13. Base price και wholesale price

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    p.wholesale_price,
    p.price,
    (p.price - p.wholesale_price) AS gross_difference
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
WHERE p.active = 1
ORDER BY gross_difference ASC;

Warning

Το gross_difference δεν είναι πραγματικό εμπορικό margin. Δεν λαμβάνει υπόψη taxes, discounts, specific prices ή άλλα business rules.

14. Products που έχουν specific prices

SQL
SELECT
    p.id_product,
    p.reference,
    pl.name,
    COUNT(sp.id_specific_price) AS specific_price_rules
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
INNER JOIN ps_specific_price sp
    ON sp.id_product = p.id_product
GROUP BY
    p.id_product,
    p.reference,
    pl.name
ORDER BY specific_price_rules DESC, pl.name;

15. Mini Catalogue Health Check

SQL
SELECT
    COUNT(*) AS total_active_products,
    SUM(CASE WHEN reference IS NULL OR TRIM(reference) = '' THEN 1 ELSE 0 END) AS missing_reference,
    SUM(CASE WHEN ean13 IS NULL OR TRIM(ean13) = '' THEN 1 ELSE 0 END) AS missing_ean
FROM ps_product
WHERE active = 1;
Screenshot Placeholder 02 MEDIA TO ADD

Result table από το Mini Catalogue Health Check.

Το query είναι μόνο η αρχή

Η SQL μπορεί να γίνει ένα γρήγορο εργαλείο για:

Audit → Find → Export → Transform → Verify

Official references

  • https://devdocs.prestashop-project.org/9/faq/stock/
  • https://devdocs.prestashop-project.org/9/webservice/resources/stock_availables/

Επόμενο βήμα

Μετέτρεψε αυτά τα checks σε reusable datasets με τον οδηγό για SQL joins και catalogue reports. Αν ελέγχεις αποκλίσεις τιμών, δες πρώτα πώς τα Specific Prices αλλάζουν την τελική τιμή.

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

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

ΑΝΕΝΕΡΓΟ