Μια βοήθεια σε query please

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από dva_dev » 21 Ιούλ 2015 14:33

Το μόνο που έχω να προτείνω ακόμα είναι αν έχεις πολλά δεδομένα να δοκιμάσεις τι indexes μπορείς να αξιοποιήσεις. Αν πρόκειται απλώς για μερικές εκατοντάδες εγγραφές μάλλον δεν αξίζει τον κόπο να ασχοληθείς.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από gvre » 21 Ιούλ 2015 15:49

Δοκίμασε το παρακάτω. Αν παίζει όπως θέλεις, θα χρειαστεί να προσθέτεις τη γραμμή "AND EXISTS ..." για κάθε variant.

Κώδικας: Επιλογή όλων

SELECT DISTINCT productID 
FROM features f 
WHERE 1=1
AND EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=1) 
AND EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=10) 
AND EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=32)

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από korgr » 21 Ιούλ 2015 18:38

Σας ευχαριστώ παιδιά!
gvre έδειξες το φως στο τούνελ!!! :D
Δούλεψε με την εξής παραλαγή:

Κώδικας: Επιλογή όλων

SELECT DISTINCT productID
FROM features f
WHERE 1=1
AND (
EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=1)
)
AND (
EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=10) 
OR 
EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=32)
)
Δηλαδή να χωρίσουμε τα variantIDs σε ομάδες ανά featureID και να παίξουμε με συνδυασμό AND και OR

Solved!!! :D

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από gvre » 21 Ιούλ 2015 19:47

Αν έχεις ομάδες με πολλαπλή επιλογή, μπορείς να το κάνεις με IN στο variant για να απλοποιήσεις το query και να το χτίζεις πιο εύκολα στην php.

πχ.

Κώδικας: Επιλογή όλων

SELECT DISTINCT productID 
FROM features f 
WHERE 1=1 
AND EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID=1) 
AND EXISTS (SELECT 1 FROM features WHERE productID=f.productID AND variantID IN (10,32))

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από korgr » 21 Ιούλ 2015 20:23

Σωστός!!! :D

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από dva_dev » 21 Ιούλ 2015 21:06

Βλέπω ότι ο gvre κινείται με εντελώς διαφορετικό σκεπτικό :)

Λοιπόν νομίζω ότι αυτό έχει απλοποιηθεί αρκετά

Κώδικας: Επιλογή όλων

select productid
from features
where variantid in (1, 2, 8, 10, 23, 25)
group by productid 
having
    count(distinct featureid) =
    (select count(distinct featureid) from feature_variants where id in (1, 2, 8, 10, 23, 25))

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από korgr » 21 Ιούλ 2015 21:42

And the winner is......

Μέσος χρόνος εκτέλεσης με προς το παρών 29 εγγραφές στον πίνακα features (xampp on windows 7 οπότε σε linux θα είναι πιο γρήγορο)
0.0007 dva_dev
0.0028 gvre

Θα κρατήσω την πρόταση του dva_dev ως εμφανώς ταχύτερη

Χίλια ευχαριστώ και τους δυο σας, δεν έχω λόγια!
viva κοινότητα!

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από gvre » 21 Ιούλ 2015 21:57

Επειδή στις 29 εγγραφές είναι πολύ πιθανό να μη χρησιμοποιούνται καν τα indexes, σου προτείνω να βάλεις μερικές χιλιάδες εγγραφές, να δεις τα indexes και να το ξανατρέξεις με πολλά και λίγα variants. Μετά, μπορείς να κρατήσεις αυτό που σε ικανοποιεί περισσότερο :)

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από korgr » 21 Ιούλ 2015 22:29

Έτσι κι αλλιώς έχω κρατήσει commented μέσα στην μέθοδο getProductsByFilters($variantIDs) και την δική σου προσέγγιση gvre ώστε να γίνουν και μελλοντικά κάποια tests σε πραγματικές συνθήκες :)

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από gvre » 21 Ιούλ 2015 22:52

Καλύτερα να τα δεις απ' ευθείας (για να μη μεσολαβεί δίκτυο, apache, κλπ) σε μια βάση (σε production server) με πολλά προϊόντα και variants, έχοντας ενεργοποιήσει τον profiler της mysql. Όταν το κάνεις, στείλε τα αποτελέσματα και το schema, δεδομένα των 2 πινάκων για να έχουμε μια εικόνα.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από korgr » 22 Ιούλ 2015 08:41

Πρώτον έχουμε άγνωστες λέξεις. Τι είναι ο mysql profiler?
Δεύτερον πως θα έχω πολλές εγγραφές αν δεν κάνω data-entry με dummy products πράγμα που είναι χρονοβόρο?
Γενικά προτιμώ να τα αντιμετωπίσω τα όποια θέματα όταν προκύψουν (όταν τύχει ένα μεγάλο e-shop). Προς το παρών καλύφθηκα έτσι οπότε πάμε παρακάτω γιατί έχουν να γίνουν πολλά πράγματα ακόμα και υπάρχει λίγος χρόνος :)

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Μια βοήθεια σε query please

Δημοσίευση από gvre » 22 Ιούλ 2015 09:00

MySQL Profiler: https://dev.mysql.com/doc/refman/5.5/en ... ofile.html

Μπορείς να περάσεις πολλές εγγραφές μόνο στους πίνακες features, feature_variants με κάποιο script.

Ο χρόνος είναι χρήμα, οπότε, όπως είπες κι εσύ, πάμε παρακάτω :)

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες