Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

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

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

Απάντηση
toYboY2
Δημοσιεύσεις: 5
Εγγραφή: 21 Μαρ 2008 14:53

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από toYboY2 » 24 Μαρ 2008 12:25

Καλησπέρα σας.
Το πρόβλημά μου έχει να κάνει ως εξής:
Ας υποθέσουμε πως έχω ένα table ονόματα ζώων, ένα με χαρακτηριστικά ζώων και ένα που να συνδέει τα δύο αυτά μεταξύ τους.
Οι τρείς πίνακες θα είναι ως εξής:

Πίνακας animals

animal_id | animal_name
1 | Λιοντάρι
2 | Ελέφαντας
3 | Φάλαινα



Πίνακας characteristics

char_id | char
1 | Δυνατό
2 | Σαρκοφάγο
3 | Γρήγορο
4 | Θηλαστικό


Πίνακας animals_chars

animal_id | char_id
1 | 1
1 | 2
1 | 4
2 | 1
2 | 4
3 | 1
3 | 4

Ένα ζώο δηλαδή μπορεί να έχει πολλά χαρακτηριστικά.
Το προβλημά μου είναι πως δεν μπορώ να κάνω ένα ερώτημα που να μου επιστρέφει τα ζώα που έχουν 2 χαρακτηριστικά και πάνω, είναι δηλαδή δυνατά ΚΑΙ γρήγορα.

Θα μπορούσα να γράψω κατι σαν:

SELECT animals.animal_id
FROM
animals
JOIN
animals_chars
ON animals.animal_id = animals_chars.animal_id
JOIN
characteristics
ON characteristics.char_id = animals_chars.char_id
WHERE
animals_chars.char_id = 1 AND animals_chars.char_id = 3

Αυτό όμως μου γυρνάει πάντα άδειο σύνολο αποτελεσμάτων γιατί
animals_chars.char_id δεν μπορεί να είναι ταυτόχρονα δύο τιμές.
Επίσης θα προτιμούσα να μη χρησιμοποιήσω JOIN διότι επιβραδύνει πολύ το ερώτημα.
Καμιά ιδέα;

xkorakidis
Δημοσιεύσεις: 26
Εγγραφή: 04 Απρ 2007 10:21
Τοποθεσία: Athens

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από xkorakidis » 24 Μαρ 2008 13:24

where count(charaktiristiko) >=2 kai group by charaktiristiko dokimase... me ligous syndiasmous 8a tin bgaleis tin akri. endexomenws na sou zitisei na baleis k ta ypoloipa pedia tis select se group i kapoia alli aggregate function, mallon 8a paiksei an ta baleis meta to charaktiristiko stin idia group

toYboY2
Δημοσιεύσεις: 5
Εγγραφή: 21 Μαρ 2008 14:53

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από toYboY2 » 24 Μαρ 2008 13:30

Αυτό θα μου γυρίσει αποτελέσματα για ζώα που έχουν 2 οποιαδήποτε χαρακτηριστικά και πάνω, αλλά εγώ θέλω να ψάχνω για συγκεκριμένα χαρακτηριστικά, δηλαδή για παράδειγμα ζώα που έχουν οπωσδήποτε το char_id 1 και char_id 2.

xkorakidis
Δημοσιεύσεις: 26
Εγγραφή: 04 Απρ 2007 10:21
Τοποθεσία: Athens

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από xkorakidis » 24 Μαρ 2008 14:04

and ((charaktiristiko = 1) or (charaktiristiko=2))
/
and charaktiristiko in (1,2)
mazi me ta proigoumena, 8a paiksei fantazomai

toYboY2
Δημοσιεύσεις: 5
Εγγραφή: 21 Μαρ 2008 14:53

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από toYboY2 » 25 Μαρ 2008 12:40

Δυστυχώς δεν καταφέρνω να βγάλω άκρη :(

toYboY2
Δημοσιεύσεις: 5
Εγγραφή: 21 Μαρ 2008 14:53

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από toYboY2 » 25 Μαρ 2008 13:37

Το sql source για τους πινακες μου είναι:

CREATE TABLE `animals` (
`animal_id` int(5) NOT NULL auto_increment,
`animal_name` varchar(50) collate utf8_unicode_ci NOT NULL default '',
PRIMARY KEY (`animal_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

--
-- 'Αδειασμα δεδομένων του πίνακα `animals`
--

INSERT INTO `animals` VALUES(1, 'Λιοντάρι');
INSERT INTO `animals` VALUES(2, 'Ελέφαντας');
INSERT INTO `animals` VALUES(3, 'Φάλαινα');

CREATE TABLE `animals_chars` (
`animal_id` varchar(5) collate utf8_unicode_ci NOT NULL default '',
`char_id` varchar(5) collate utf8_unicode_ci NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- 'Αδειασμα δεδομένων του πίνακα `animals_chars`
--

INSERT INTO `animals_chars` VALUES('1', '1');
INSERT INTO `animals_chars` VALUES('1', '2');
INSERT INTO `animals_chars` VALUES('1', '4');
INSERT INTO `animals_chars` VALUES('2', '1');
INSERT INTO `animals_chars` VALUES('2', '4');
INSERT INTO `animals_chars` VALUES('3', '1');
INSERT INTO `animals_chars` VALUES('3', '4');

CREATE TABLE `characteristics` (
`char_id` int(5) NOT NULL auto_increment,
`char` varchar(50) collate utf8_unicode_ci NOT NULL default '',
PRIMARY KEY (`char_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

--
-- 'Αδειασμα δεδομένων του πίνακα `characteristics`
--

INSERT INTO `characteristics` VALUES(1, 'Δυνατό');
INSERT INTO `characteristics` VALUES(2, 'Σαρκοφάγο');
INSERT INTO `characteristics` VALUES(3, 'Γρήγορο');
INSERT INTO `characteristics` VALUES(4, 'Θηλαστικό');

billiaswhs
Δημοσιεύσεις: 346
Εγγραφή: 11 Νοέμ 2004 00:29
Επικοινωνία:

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από billiaswhs » 26 Μαρ 2008 04:19

Κοίτα να δεις αν εκτελέσεις το παρακάτω ερώτημα

SELECT characteristics.char FROM `characteristics` WHERE
characteristics.char_id=4

Δεν έχεις κανένα πρόβλημα Αν όμως εκτελέσεις το

SELECT characteristics.char FROM `characteristics` WHERE
characteristics.char_id=1
AND
characteristics.char_id=4

Επιστρέφει άδειο αποτέλεσμα δηλαδή το πρόβλημα είναι στο AND στη Mysql
συν ότι στο πίνακα
animals_chars
λείπει ο συνδιασμός
(1,3)
δηλαδή ότι το λιοντάρι είναι γρήγορο οπότε ίσως και αυτός είναι λόγος άδειου ερωτήματος

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από Apostolis_38 » 26 Μαρ 2008 12:04

Δοκίμασε αυτό:
select animal_id.a,animal_name.a,char_id.b,animal_id.c
from animals a, characteristics b, animals_chars c
where animal_id.a = char_id.b = animal_id.c

Με αυτό τον τρόπο του ορίζεις πως ότι έχει .a βρίσκεται στον πίνακα animals a
οτι ορίζεις .b βρίσκεται στον πίνακα characteristics b κ.λ.π.
Μπορείς να χρησιμοποιήσεις όσα πεδία θέλεις (πρόσεχε μόνο μην μπερδευτείς με τα a και b :D ). Απλώς πρόσεχε λίγο με τα order by ή group by.

Επίσης, αν επεξεργάζεσαι τα στοιχεία με την php απέφευγε να δίνεις ίδια ονόματα στα rows, ακόμα κι αν ανήκουν σε διαφορετικά tables.
π.χ.: animals = animal_id και animals_char = animchar_id
και όχι animals_char = animal_id.
Μου έχει τύχει μερικές φορές να μην μπορεί το script να "ξεχωρίσει" τα δύο rows.
Δεν ξέρω αν έτυχε αλλά απο τότε που σταμάτησα να χρησιμοποιώ αυτή τη μορφή στούς πίνακες, δεν μου ξαναέτυχε αυτό το πρόβλημα.

steve
Δημοσιεύσεις: 63
Εγγραφή: 29 Απρ 2003 20:49

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από steve » 26 Μαρ 2008 13:24

Κοίτα να δεις αν εκτελέσεις το παρακάτω ερώτημα

SELECT characteristics.char FROM `characteristics` WHERE
characteristics.char_id=4

Δεν έχεις κανένα πρόβλημα Αν όμως εκτελέσεις το

SELECT characteristics.char FROM `characteristics` WHERE
characteristics.char_id=1
AND
characteristics.char_id=4

Επιστρέφει άδειο αποτέλεσμα δηλαδή το πρόβλημα είναι στο AND στη Mysql
Δοκιμασε να βαλεις OR αντι για AND. Αυτο θα σου λυσει το προβλημα που αναφερεις παραπανω.....


S.
Εικόνα

toYboY2
Δημοσιεύσεις: 5
Εγγραφή: 21 Μαρ 2008 14:53

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από toYboY2 » 26 Μαρ 2008 14:01

Noμίζω πως τελικά βρήκα μια λύση που δεν απέχει πολύ απο αυτό που είπε ο xokorakidis.

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

SELECT temp1.animal_id, temp1.char_id, COUNT(*) AS counter
FROM animals_chars AS temp1
WHERE (temp1.char_id = 2 OR temp1.char_id = 4)
GROUP BY temp1.animal_id
Αυτό θα μου γυρίσει:

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

animal_id 	char_id 	counter
1 		    2 		       2
2 		    4 		       1
3 		    4 		       1
Το νούμερο 2 στον counter σημαίνει πως το animal_id 1 βρέθηκε δύο φορές οπότε ανήκει και στις δύο κατηγορίες που έψαχνα, ενώ τα άλλα δύο ανήκουν μόνο στη μία.
Έτσι μπορώ να τσεκάρω με την php ποιό απο τα αποτελέσματα μου έχει counter ίσο με τον αριθμό των κριτηρίων που ψάχνω.
Δεν νόμιζω πως είναι και η καλύτερη λύση αλλά είναι η μόνη ικανοποιητική.

xkorakidis
Δημοσιεύσεις: 26
Εγγραφή: 04 Απρ 2007 10:21
Τοποθεσία: Athens

Πρόβλημα με πολλαπλή επιλογή απο 3 πίνακες

Δημοσίευση από xkorakidis » 31 Μαρ 2008 16:07

and `counter` = ? i an protimas panta 2 katigoriwn to kaneis and `counter` = 2.

Απάντηση

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

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

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