Βοηθεια σε query με 3 tables

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

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

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 21 Οκτ 2009 18:14

Μια μικρη βοηθεια γιατι ...κολησα!
Αφορα μια σελιδα με καταχωρηση αυτοκινητων (αγγελιες).
Τα tables με τα πεδια που αφορουν το query (για να μην σας μπερδεψω) ειναι τα ακολουθα:
  • Table "cars"
    id
    member (id of publisher απο τον πινακα members)
    active (flag 0|1 που προσδιοριζει αν ειναι ενεργη η αγγελια)
  • Table "members"
    id
    active (flag 0|1 που προσδιοριζει αν ειναι ενεργος ο λογαριασμος του publisher)
  • Table "carExtras"
    id
    car_id (το id απο τον πινακα cars)
    extra_id (id που προσδιοριζει καποιο extra χαρακτηριστικο του αυτοκινητου, απο τον πινακα extras που κραταει τις περιγραφες)
To query πρεπει να εμφανιζει εγγραφες απο τον πινακα cars οταν η αγγελια ειναι active, οταν ο publisher εχει active λογαριασμο και οταν δινονται καποια συγκεκριμενα extra_id που πρεπει να τα εχει ολα το αυτοκινητο.

Για αναζητησεις οπου ψαχνω ταυτοποιηση με ενα απο τα χαρακτηριστικα που ζηταω δουλευει μια χαρα το:

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

select distinct cars.* from cars, members, carExtras
where cars.member=members.id 
and members.active=1 
and cars.active=1 
and (carExtras.extra_id='3' or carExtras.extras_id='8' and carExtras.car_id=cars.id )
Για ταυτοποιηση ομως με ΟΛΑ τα χαρακτηριστικα που δινονται δεν καταφερα να βρω λυση που να δουλευει σωστα. Θελω δηλαδη τις εγγραφες απο τον πινακα cars οπου τα αυτοκινητα να εχουν δηλωμενα και το 3 και το 8 (id χαρακτηριστικων).
Κατι με Joins πρεπει να παιζει αλλα εκει ...χανομαι :evil:

Οποια βοηθεια ευπροσδεκτη...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Βοηθεια σε query με 3 tables

Δημοσίευση από fafos » 21 Οκτ 2009 18:58

den to polykatalava.. thes eggrafes mono apo ta 2 id ton extra h apo oiandhpote extra?

to or sta extra vale to se dikia tou parenthesh gia arxh:

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

((carExtras.extra_id='3' or carExtras.extras_id='8') and carExtras.car_id=cars.id ) 
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 21 Οκτ 2009 20:05

Αυτο με το or που εβαλα σαν παραδειγμα query, δουλευει μια χαρα.
Μου φερνει αυτοκινητα που εχουν ως extra το extra με id3 ή με id8.
Δηλαδη αν υποθεσουμε πως το extra_id=3 ειναι υδραυλικο τιμονο και το extra_id=8 ειναι Radio-CD, θελω ως αποτελεσμα τα αυτοκινητα που εχουν και Radio-CD και υδραυλικο τιμονι.

Νομιζα πως αντι του or αν εβαζα and θα γινοταν, αλλα με and μου επιστρεφει 0 αποτελεσματα, αν και υπαρχει αυτοκινητο με τα ζητουμενα extra χαρακτηριστικα!

Δεν ξερω αν μπορεσα να το περιγραψω σωστα :roll:
Σε ευχαριστω εκ των προτερων...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Βοηθεια σε query με 3 tables

Δημοσίευση από fafos » 21 Οκτ 2009 20:29

to distinct giati to vazeis? an den kano lathos etsi tha sou gyrnaei mono tis protes eggrafes me ton idio titlo p.x. an exeis 2 "audi A4" san titlo tha sou gyrisei mono to ena ... to or pantos prepei na sthn gyrnaei kai thn eggrafh me ola ta extra... gia dokimase xoris distinct...

to exeis dokimasei mono me to or? xoris ta alla and dhladh...
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 21 Οκτ 2009 21:30

To distinct κοβει ιδια rows οχι ιδια fields. Οταν το βγαλω παντως μου επιστρεφει καποια αυτοκινητα διπλά...
βλεπε screenshot

To or μου επιστρεφει ομως και αλλα αυτοκινητα που εχουν μονο ενα κριτηριο απο τα δυο που ζηταω...
Συνημμένα
Capture.GIF
(15.03 KiB) Μεταφορτώθηκε 230 φορές

psapikas
Δημοσιεύσεις: 25
Εγγραφή: 19 Σεπ 2009 08:25

Βοηθεια σε query με 3 tables

Δημοσίευση από psapikas » 21 Οκτ 2009 22:24

Είναι λογικό το AND να μην σου βγάζει αποτελέσματα καθώς ζητάς από 1 πεδίο (extra_id) να παίρνει ταυτόχρονα 2 διαφορετικές τιμές...

Γνώμη μου είναι να κάνεις δύο ερωτήματα και μετά να πάρεις την τομή τους (intersect)

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Βοηθεια σε query με 3 tables

Δημοσίευση από fafos » 21 Οκτ 2009 23:03

h intersect parousiazei provlhmata merikes fores se megales vaseis..


dokimase thn UNION:

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

select distinct(cars.id),cars.member,cars.active,members.id,members.active,carExtras.extra_id,carExtras.car_id from cars, members, carExtras
where cars.member=members.id
and members.active=1
and cars.active=1
and carExtras.car_id=cars.id
and carExtras.extra_id='3'   

UNION

select distinct(cars.id),cars.member,cars.active,members.id,members.active,carExtras.extra_id,carExtras.car_id from cars, members, carExtras
where cars.member=members.id
and members.active=1
and cars.active=1
and carExtras.car_id=cars.id
and carExtras.extra_id='8' 

ORDER BY cars.id


ksexorisa to distinct mono gia to car.id giati pisteuo etsi opos to exeis an vrei member me to idio id tha vgalei mono thn proth eggrafh autou tou member..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

psapikas
Δημοσιεύσεις: 25
Εγγραφή: 19 Σεπ 2009 08:25

Βοηθεια σε query με 3 tables

Δημοσίευση από psapikas » 21 Οκτ 2009 23:14

Με union θα φέρει και εγγραφές που πληρούν μόνο το 1 από τα 2 κριτήρια

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 21 Οκτ 2009 23:20

fafos σε ευχαριστω πολυ. Δεν το δοκιμασα αυτο που προτεινες γιατι πριν λιγο και μετα απο πολλες δοκιμες και surfing κατεληξα σε μια λυση που δουλευει πολυ καλα!

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

select * from cars
join members on (cars.member=members.id and members.active=1)
join carExtras on cars.id=carExtras.car_id 
and (carExtras.extra_id=1 or carExtras.extra_id=2)
where cars.active=1 
GROUP BY carExtras.car_id 
HAVING count(carExtras.car_id)=2
Απλα οταν εχω περισσοτερα απο ενα κριτηριο extras_id θα πρεπει να τα προσθετω με OR και να αλλαζω την τιμη της count με τον αριθμο των κριτηριων!

psarikas αφηνω τελευταιο ενα μεγαλο ευχαριστω και σε σενα γιατι με "ξεκολησες" με το να δω πως ηταν ατοπο αυτο που ζητουσα και ετσι κατεληξα στη λυση

Άβαταρ μέλους
Banavas
Script Master
Δημοσιεύσεις: 1367
Εγγραφή: 21 Νοέμ 2004 20:25
Επικοινωνία:

Βοηθεια σε query με 3 tables

Δημοσίευση από Banavas » 21 Οκτ 2009 23:37

Φίλε μου korgr,

κατά την άποψή μου, νομίζω οτι έχεις λάθος στην ανάλυση με αποτέλεσμα να παιδεύεσαι άσκοπα.

Αρχικά, κακώς μπερδεύεις τους members με την αναζήτηση. Το active των αγγελιών για μένα αρκεί. (Όταν κάνεις έναν member inactive μπορείς να γυρνάς και όλες τις αγγελίες του σε inactive.) Γενικά εδώ δεν μπορώ να καταλάβω τι νόημα έχουν οι inactive members.

κατά την άποψή μου πάντα, καλό θα ήταν να έχεις όλα τα χαρακτηριστικά του αυτοκινήτου σε ένα πίνακα (τουλάχιστον τα αναζητήσιμα) και σε ένα δεύτερο τις επιπλέον φωτογραφίες πέραν της βασικής.

Με αυτό το σχήμα κάνεις την αναζήτησή σου είτε απλή είτε σύνθετη με όσα χαρακτηριστικά θέλεις απλά και εύκολα.
Μόλις ο χρήστης επιλέξει ένα αυτοκίνητο για να δει περισσότερες λεπτομέρειες κάνεις μια ή δύο επιπλέον αναζητήσεις για να εμφανίσεις επιπλέον φωτογραφιών ή χαρακτηριστικά.
Happy coding....
Μάρκος
http://lasernet.gr

psapikas
Δημοσιεύσεις: 25
Εγγραφή: 19 Σεπ 2009 08:25

Βοηθεια σε query με 3 tables

Δημοσίευση από psapikas » 21 Οκτ 2009 23:43

Πάλι νομίζω δεν λύνεις το πρόβλημα σου:

Εύρεση αμαξιών ΚΑΙ με τα 2 χαρακτηριστικά ΤΑΥΤΟΧΡΟΝΑ.
Το or δεν στο εξασφαλίζει από μόνο του

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 22 Οκτ 2009 00:23

psapikas έγραψε:Πάλι νομίζω δεν λύνεις το πρόβλημα σου:

Εύρεση αμαξιών ΚΑΙ με τα 2 χαρακτηριστικά ΤΑΥΤΟΧΡΟΝΑ.
Το or δεν στο εξασφαλίζει από μόνο του
Και ομως φιλε μου!
Την διαφορα την κανει η

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

GROUP BY carExtras.car_id
HAVING count(carExtras.car_id)=2 
Εγιναν πολλες δοκιμες με ενα, με λιγα ή πολλα κριτηρια, και το αποτελεσμα ειναι αλανθαστο...

psapikas
Δημοσιεύσεις: 25
Εγγραφή: 19 Σεπ 2009 08:25

Βοηθεια σε query με 3 tables

Δημοσίευση από psapikas » 22 Οκτ 2009 00:36

Για βάλε και τρίτο χαρακτηριστικό άσχετο με την ερώτηση στα αμάξια που ικανοποιούν το ερώτημά σου.

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

Βοηθεια σε query με 3 tables

Δημοσίευση από korgr » 22 Οκτ 2009 00:55

psapikas έγραψε:Για βάλε και τρίτο χαρακτηριστικό άσχετο με την ερώτηση στα αμάξια που ικανοποιούν το ερώτημά σου.
Εννοεις κατι σαν αυτο?

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

select * from cars
join members on (cars.member=members.id and members.active=1)
join carExtras on cars.id=carExtras.car_id
and (carExtras.extra_id=1 or carExtras.extra_id=2 or carExtras.extra_id=8 )
where cars.active=1
GROUP BY carExtras.car_id
HAVING count(carExtras.car_id)=3 
Το carExtras.extra_id=8 δεν αντιστοιχει σε κανενα αυτοκινητο κι αν και ικανοποιουνται τα πρωτα δυο κριτηρια δεν επιστρεφει κανενα αποτελεσμα.
Δηλαδη το προσδοκομενο!

Εκτος αν δεν σε καταλαβα... :roll:

psapikas
Δημοσιεύσεις: 25
Εγγραφή: 19 Σεπ 2009 08:25

Βοηθεια σε query με 3 tables

Δημοσίευση από psapikas » 22 Οκτ 2009 01:04

Μπορεί κάποιο αυτοκίνητο να έχει 3 χαρακτηριστικά, αλλά να μην είναι τα 3 που ζητάς (μπορεί να έχω μπερδευτεί και εγώ τώρα...)

Απάντηση

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

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

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