PrestaShop SQL Manager: 15 χρήσιμα queries που αξίζει να έχεις αποθηκευμένα
Δεν χρειάζεται κάθε έλεγχος στον κατάλογο ενός 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.
PrestaShop Back Office → SQL Manager. Να φαίνεται το σημείο δημιουργίας νέου SQL query.
1. Όλα τα ενεργά προϊόντα
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
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
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
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 χωρίς εικόνα
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
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
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
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
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
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
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
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
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
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
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;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 αλλάζουν την τελική τιμή.