Προς το περιεχόμενο

εύρεση σε πίνακα mysql


dinak

Προτεινόμενες αναρτήσεις

Δημοσ.

έχω μία βάση δεδομένων με αρκετούς πίνακες, εκ των οποίων οι δύο είναι οι: περιφέρεια( ονομα περιφέρειας (key), # εδρών) και συνδυασμός (όνομα συνδυασμού(key), όνομα περιφέρειας, επικεφαλής)

και θέλω να εισάγω ένα συνδυασμό σε περιφέρεια μέσα από stored procedure αλλά δε πρέπει να υπάρχει συνδυασμός με το ίδιο όνομα σε άλλη περιφέρεια...

πως μπορώ να κάνω τον τελευταίο έλεγχο;

Δημοσ.

έχω μία βάση δεδομένων με αρκετούς πίνακες, εκ των οποίων οι δύο είναι οι: περιφέρεια( ονομα περιφέρειας (key), # εδρών) και συνδυασμός (όνομα συνδυασμού(key), όνομα περιφέρειας, επικεφαλής)

και θέλω να εισάγω ένα συνδυασμό σε περιφέρεια μέσα από stored procedure αλλά δε πρέπει να υπάρχει συνδυασμός με το ίδιο όνομα σε άλλη περιφέρεια...

πως μπορώ να κάνω τον τελευταίο έλεγχο;

 

Αφού το όνομα του συνδυασμού είναι primary key στον πίνακα δεν πρέπει να σε αφήσει έτσι και αλλιώς να καταχωρήσεις διπλά κλειδιά... Κανονικά πρέπει να σου βγάλει error αν το κάνεις.

Δημοσ.

Αφού το όνομα του συνδυασμού είναι primary key στον πίνακα δεν πρέπει να σε αφήσει έτσι και αλλιώς να καταχωρήσεις διπλά κλειδιά... Κανονικά πρέπει να σου βγάλει error αν το κάνεις.

 

ναι το ξέρω...αλλά η άσκηση ζητάει να γίνεται έλεγχος :/

τέλος πάντων αυτό που έκανα τελικά είναι να ψάχνω τις γραμμές μία μία με cursor!

αλλά δεν ξέρω κατά πόσο θα δουλεύει, γιατί έχω ένα άλλο πρόβλημα που δεν ξέρω πως να λύσω

 

λοιπόν τώρα έχω και έναν τρίτο πίνακα

υποψήφιος(όνομα, αριθμός ταυτότητας(κλειδί), όνομα συνδυασμού(ξένο κλειδί)) και τους

περιφέρεια( όνομα περιφέρειας (key), # εδρών) και

συνδυασμός (όνομα συνδυασμού(key), όνομα περιφέρειας (ξένο κλειδί), αριθμός ταυτότητας διευθυντή(ξένο κλειδί στο υποφήψιος(αρ.ταυτότητας)) )

 

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

Δημοσ.

>SELECT count(*) FROM "συνδυασμός" WHERE "όνομα συνδυασμού"=new_entrys_name;

Μετά ελέγχεις αν το count είναι >0 και αν είναι σημαίνει ότι υπάρχει, αλλιώς δεν υπάρχει. Δεν χρειάζεται να ανοίγεις cursor... Φορτώνεις χωρίς λόγο την βάση σου.

 

Για την δεύτερη ερώτησή σου, δεν ξέρω πώς γίνεται αυτό στην mySQL. Σε άλλες βάσεις ξέρω ότι γίνεται με transactions να κάνει validate τα triggers στο commit και όχι σε κάθε ερώτημα χωριστά. Έψαξα λίγο αλλά δεν μπόρεσα να το βρω αυτό για την mySQL. Ίσως κάποιο από τα άλλα παιδιά εδώ γνωρίζει πως γίνεται.

Μία άλλη λύση αν μπορείς είναι να φτιάξεις μία stored procedure και αφού βεβαιωθείς ότι δεν θα έχεις διπλές εγγραφές να κάνεις disables τα keys των πινάκων, να κάνεις ένα ένα τα insert και μετά ξανά enable τα keys.

Δημοσ.

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

 

Εναλλακτικό παραδειγμα μια εταιρία έχει υπαλλήλους και τμήματα . Ένα τμήμα έχει τον διευθυντή , τον προιστάμενο και άλλους υπαλλήλους . Η θέση υπαλλήλου χαρακτηρίζει τον υπάλληλο και όχι το τμήμα. Δηλαδή δεν κάνεις το εξής

 

Πίνακας Τμήμα

--------------------------------

ΚΛΕΙΔΙ ΔΙΕΥΘΥΝΤΗΣ(FK) ΠΡΟΙΣΤΑΜΕΝΟΣ(FK) ΚΤΛ ....

 

ΑΛΛΑ

 

ΠΙΝΑΚΑΣ ΥΠΑΛΛΗΛΟΣ

--------------------------------

ΚΛΕΙΔΙ ΟΝΟΜΑ_ΥΠΑΛΛΗΛΟΥ ΘΕΣΗ_ΥΠΑΛΛΗΛΟΥ TMHMA(FK)

 

Οπότε στην περίπτωση σου ο υποψήφιος έχει μια θέση . Αυτή μπορεί να είναι πχ διευθυντής ή απλό μέλος . Επομένως δεν χρειάζεται η χρήση του FK διευθυντή στον συνδυασμό. Απλά πρέπει να ορίσεις την θέση του υποψηφίου στον πίνακα ΥΠΟΨΗΦΙΟΣ .

Δημοσ.

>SELECT count(*) FROM "συνδυασμός" WHERE "όνομα συνδυασμού"=new_entrys_name;

Μετά ελέγχεις αν το count είναι >0 και αν είναι σημαίνει ότι υπάρχει, αλλιώς δεν υπάρχει. Δεν χρειάζεται να ανοίγεις cursor... Φορτώνεις χωρίς λόγο την βάση σου.

 

κατάλαβα...τελικά κάποια πράγματα είναι τόσο απλά :/

 

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

 

Εναλλακτικό παραδειγμα μια εταιρία έχει υπαλλήλους και τμήματα . Ένα τμήμα έχει τον διευθυντή , τον προιστάμενο και άλλους υπαλλήλους . Η θέση υπαλλήλου χαρακτηρίζει τον υπάλληλο και όχι το τμήμα. Δηλαδή δεν κάνεις το εξής

 

 

 

ΑΛΛΑ

 

 

 

Οπότε στην περίπτωση σου ο υποψήφιος έχει μια θέση . Αυτή μπορεί να είναι πχ διευθυντής ή απλό μέλος . Επομένως δεν χρειάζεται η χρήση του FK διευθυντή στον συνδυασμό. Απλά πρέπει να ορίσεις την θέση του υποψηφίου στον πίνακα ΥΠΟΨΗΦΙΟΣ .

 

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

 

σας ευχαριστώ πολύ παιδιά για τις απαντήσεις...χαίρομαι που μαθαίνω :)

Δημοσ.

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

αποτελέσματα(όνομα συνδυασμού, όνομα περιφέρειας, ψήφοι)

 

οπότε για να βρω το σύνολο των ψήφων για κάθε συνδυασμό δίνω το εξής select όνομα συνδυασμού, όνομα περιφέρειας, sum(ψήφοι) from αποτελέσματα group by όνομα συνδυασμού

 

τώρα πως μπορώ να βρω το max για κάθε περιφέρεια;

Δημοσ.

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

αποτελέσματα(όνομα συνδυασμού, όνομα περιφέρειας, ψήφοι)

 

οπότε για να βρω το σύνολο των ψήφων για κάθε συνδυασμό δίνω το εξής select όνομα συνδυασμού, όνομα περιφέρειας, sum(ψήφοι) from αποτελέσματα group by όνομα συνδυασμού

 

τώρα πως μπορώ να βρω το max για κάθε περιφέρεια;

Ακριβώς όπως το είπες... Χρησιμοποίησε την max για να σου επιστρέψει μόνο το μέγιστο!

Δημοσ.

Ακριβώς όπως το είπες... Χρησιμοποίησε την max για να σου επιστρέψει μόνο το μέγιστο!

 

μου βγάζει όμως error αν κάνω κάτι του στυλ max(sum(ψήφοι))...και με nested query προσπάθησα αλλά πάλι κάτι κάνω λάθος και μου βγάζει ERROR 1241 (21000): Operand should contain 1 column(s) :/

Δημοσ.

μου βγάζει όμως error αν κάνω κάτι του στυλ max(sum(ψήφοι))...και με nested query προσπάθησα αλλά πάλι κάτι κάνω λάθος και μου βγάζει ERROR 1241 (21000): Operand should contain 1 column(s) :/

 

Δεν ξέρω αν γίνεται το max(sum(ψήφοι)).

Δοκίμασε κάτι τέτοιο (δεν ξέρω αν ακριβώς έτσι δουλεύει)

>SELECT όνομα συνδυασμού, όνομα περιφέρειας, max(ψήφοι)
FROM ( SELECT όνομα συνδυασμού, όνομα περιφέρειας, sum(ψήφοι) AS ψήφοι
      FROM αποτελέσματα
      GROUP BY όνομα συνδυασμού ) AS sum_apotelesmata
GROUP BY ψήφοι

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...