katina Δημοσ. 27 Νοεμβρίου 2011 Δημοσ. 27 Νοεμβρίου 2011 Καλησπέρα σας, έχω 2 πίνακες σε sql. users(id,name) milestones(id, name, description, due_date, assigned_to_user_id, completed_on, completed_by_id, created_on, created_by_id) Ουσιαστικά ο ένας πίνακας έχει τους χρήστες με τα ονόματα τους και ο 2οs κάποιες εργασίες (milestones - tasks) που πρέπει να κάνουν. Ο κάθε χρήστης αναθέτει σε έναν άλλο χρήστη σε μία συγκεκριμένη ημερομηνία. Θέλω να βγαίνει μία αναφορά (με query προφανώς) ποιος χρήστης κατά μέσο όρο στο σύνολο των milestones έχει το μεγαλύτερο διάστημα μεταξύ των dates (completed_on - created_on). Ποιος δηλαδή δίνει τον περισσότερο χρόνο στον χρήστη για να εκτελέσει το task. Καμιά ιδέα;
_tasos Δημοσ. 27 Νοεμβρίου 2011 Δημοσ. 27 Νοεμβρίου 2011 Νομίζω πως θέλεις κάτι τέτοιο: > SELECT AVG(DATEDIFF(completed_on, created_on)) AS avg_time,created_by_id AS user_id FROM milestones GROUP BY created_by_id ORDER BY avg_time DESC Δεν το έτρεξα το query, οπότε ίσως έχει ξεφύγει κάτι.
katina Δημοσ. 30 Νοεμβρίου 2011 Μέλος Δημοσ. 30 Νοεμβρίου 2011 Θα ήθελα να εμφανίζει τα εξής βασικά αν γίνεται: Όνομα Χρήστη που αναθέτει το task (Συσχέτιση name-created_by_id),Όνομα task (name),Πότε έγινε(created_on), Μέχρι πότε είναι(due_date),σε ποιον ανατέθηκε(Συσχέτιση name-assigned_to_user_id),πότε υλοποιήθηκε(completed_on) Ουσιαστικά έχω 2 συσχετίσεις. Η μία είναι το name από τον πίνακα users με το created_by_id και η 2η το name από τον πίνακα users με το assigned_to_user_id.
defacer Δημοσ. 30 Νοεμβρίου 2011 Δημοσ. 30 Νοεμβρίου 2011 Θα ήθελα να εμφανίζει τα εξής βασικά αν γίνεται: Όνομα Χρήστη που αναθέτει το task (Συσχέτιση name-created_by_id),Όνομα task (name),Πότε έγινε(created_on), Μέχρι πότε είναι(due_date),σε ποιον ανατέθηκε(Συσχέτιση name-assigned_to_user_id),πότε υλοποιήθηκε(completed_on) Ουσιαστικά έχω 2 συσχετίσεις. Η μία είναι το name από τον πίνακα users με το created_by_id και η 2η το name από τον πίνακα users με το assigned_to_user_id. Αυτό εδώ είναι τελείως διαφορετικό πράγμα μ' αυτό που ρώτησες αρχικά. Αρχικά ζήτησες αποτέλεσμα με 1 row ανά χρήστη (που αναθέτει milestones) ενώ τώρα ζητάς αποτέλεσμα με 1 row ανα task. Προφανώς (θέλω να ελπίζω) αυτά τα 2 αποτελέσματα δεν έχουν καμία σχέση το ένα με το άλλο και θα πρέπει να γίνουν με διαφορετικά queries. Άρα; Σε κάλυψε η απάντηση του Τάσου για το πρώτο και ρωτάς τώρα για το 2ο;
sp_steve Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Σορρυ που επεμβαίνει στο θέμα σου....αλλα θέλω οποσδηποτε βοήθεια... Έχω γράψει τον παρακάτω κώδικα: CREATE TABLE category( cat_id INT NOT NULL AUTO_INCREMENT, cat_tittle VARCHAR(20) NOT NULL, cat_parent INT, PRIMARY KEY (cat_id), CONSTRAINT CAT_TABL FOREIGN KEY (cat_parent) REFERENCES category(cat_id) ON DELETE CASCADE ON UPDATE CASCADE ); και θέλω να φτιάξω την παρακάτω ιεραρχία κατηγοριών: ..................|------>Atomika-------->(ski, kolimvisi,...) Sports------| ..................|------>Omadika-------->(podosfairo,basket,...) Ζητώ συγγνώμη για το σχήμα, αλλά ελπίζω να καταλάβατε τι εννοώ... Μπορείτε να μου πείτε με ποιόν τρόπο μπορώ να κάνω κάτι τέτοιο? Ευχαριστώ!
katina Δημοσ. 1 Δεκεμβρίου 2011 Μέλος Δημοσ. 1 Δεκεμβρίου 2011 Όχι, δεν το είπα σωστά μάλλον, το 2ο θέλω. Ευχαριστώ
defacer Δημοσ. 2 Δεκεμβρίου 2011 Δημοσ. 2 Δεκεμβρίου 2011 @sp_steve: Ώρα για ένα quote που μου αρέσει: "Τρελλός είναι αυτός που κάνει το ίδιο πράγμα ξανά και ξανά και περιμένει κάθε φορά διαφορετικό αποτέλεσμα". Καταλαβαίνω πως θέλεις λύση στο πρόβλημά σου. Όμως ρώτησες ήδη μία φορά ακριβώς το ίδιο πράγμα, και δεν πήρες απάντηση. Έχεις σκεφτεί την πιθανότητα πως μπορεί να υπάρχει κάποιος λόγος που έγινε αυτό; Μια σαφώς διατυπωμένη ερώτηση που έχει νόημα από κάποιον που φαίνεται πως ξέρει 2 έστω βασικά πράγματα έχει περισσότερες πιθανότητες να απαντηθεί από κάποια που δεν έχει αυτά τα χαρακτηριστικά. Δε μπορώ να μιλήσω για άλλους, αλλά η ερώτησή σου δεν είναι καλή. Όταν την πρωτοδιάβασα (στο δικό σου topic) στο μυαλό μου ήρθε η απάντηση "θα βάλεις records με κατάλληλες τιμές μέσα στον πίνακα". Το οποίο είναι τελείως προφανές (duh, πρέπει να βάλεις records για να δημιουργήσεις κατηγορίες), οπότε αμέσως σε κάνει να σκέφτεσαι ποιό λάκκο έχει η φάβα και χρειάζεται να ρωτήσεις. Εκεί είναι που καταλαβαίνεις πως ακριβώς γι' αυτό το λόγο, το πρόβλημά σου είναι άλλο (φαντάζομαι ξέρεις πώς να βάλεις records) και όποιος "τυχερός" απαντήσει θα "αναλάβει την υποχρέωση" πρώτα να μαντέψει τη σωστή ερώτηση με λίγο σπασμένο τηλέφωνο μαζί σου, μετά να την απαντήσει, και τέλος να κάνει και λίγο support αν χρειαστεί ως "ειδικός". Και όλα αυτά για ένα εντελώς τετριμμένο πρόβλημα για το οποίο υπάρχουν χιλιάδες παραδείγματα στο internet for your googling pleasure (γιατί τουλάχιστον αν ήταν να προσθέσω κάτι χρήσιμο ή καινούριο θα έλεγα ίσως να αξίζει το χρόνο που θα φάω). Λοιπόν δεν έχω απαντήσει στην αρχική σου ερώτηση αλλά αυτή ήταν η συνεισφορά που είμαι διατεθειμένος να κάνω σ' αυτό το σημείο. Your move. Όχι, δεν το είπα σωστά μάλλον, το 2ο θέλω. Ευχαριστώ Όλα αυτά που θέλεις εκτός από τα ονόματα των χρηστών υπάρχουν ήδη στον πίνακα με τα milestones οπότε δεν τα αναφέρω καν. Για να πάρεις ονόματα χρηστών από τα id τους πρέπει να κάνεις το λεγόμενο LEFT OUTER JOIN, που είναι σούπερ βασική έννοια στην SQL και σου συνιστώ να διαβάσεις επί του θέματος. Στην προκειμένη: SELECT m.id, m.name, u.name AS assignee FROM milestones m LEFT JOIN users u ON m.assigned_to_user_id = u.id Μ' αυτόν τον τρόπο επιλέγεις το όνομα του assignee (έβαλα 3 μόνο πεδία γιατί είναι παράδειγμα). Εσύ τώρα θέλεις να κάνεις κάτι ελαφρώς πιο ψαγμένο, δηλαδή να αντιστοιχίσεις 2 φορές στον πίνακα users: μία για τον assignee και μία για τον creator (η και 3 φορές αν θέλεις και το completed_by_id σαν όνομα). Αυτό γίνεται ως εξής: SELECT m.id, m.name, u1.name AS assignee, u2.name AS creator FROM milestones m LEFT JOIN users u1 ON m.assigned_to_user_id = u1.id LEFT JOIN users u2 ON m.created_by_id = u2.id Εκανα 2 φορές join τον πίνακα users δίνοντας διαφορετικό alias κάθε φορά για να μπορώ να αναφερθώ στο name που προκύπτει από τη συσχέτιση με το πρώτο join και στο name που προκύπτει από τη συσχέτιση με το δεύτερο.
Aztec Δημοσ. 3 Δεκεμβρίου 2011 Δημοσ. 3 Δεκεμβρίου 2011 Σορρυ που επεμβαίνει στο θέμα σου....αλλα θέλω οποσδηποτε βοήθεια... Έχω γράψει τον παρακάτω κώδικα: CREATE TABLE category( cat_id INT NOT NULL AUTO_INCREMENT, cat_tittle VARCHAR(20) NOT NULL, cat_parent INT, PRIMARY KEY (cat_id), CONSTRAINT CAT_TABL FOREIGN KEY (cat_parent) REFERENCES category(cat_id) ON DELETE CASCADE ON UPDATE CASCADE ); και θέλω να φτιάξω την παρακάτω ιεραρχία κατηγοριών: ..................|------>Atomika-------->(ski, kolimvisi,...) Sports------| ..................|------>Omadika-------->(podosfairo,basket,...) Ζητώ συγγνώμη για το σχήμα, αλλά ελπίζω να καταλάβατε τι εννοώ... Μπορείτε να μου πείτε με ποιόν τρόπο μπορώ να κάνω κάτι τέτοιο? Ευχαριστώ! Απλά μια δύο παρατηρήσεις . Δεν αναφέρεις to dbms που χρησιμοποιείς. Κάποια υποστηρίζουν hierarchical , recursive queries ενω άλλα όχι. Έτσι η απάντηση αλλάζει ανάλογα. Θα υποθέσω ότι δεν υποστηρίζει καθώς πιστεύω ότι λες για MySql . Ο πίνακας μια χαρα self referencing είναι επομένως τα δεδομένα τα βάζεις συνδέοντας κάθε category με κάποιο parent id που βρίσκεται ένα level πάνω στην ιεραρχία. To root node φυσικά θα έχει null στο parent id.Όσον αφορά την ανάκτηση δεν υποστήρίζεται native απο mysql. Μπορείς φυσικά,αν ξέρεις το βάθος εκ των προτέρων , να κάνεις τόσες φορές join τον ίδιο πίνακα και να πετύχεις τον αποτέλεσμα που θες. Διαφορετικά πρέπει να βρεις workaround. Το κλειδί στην ερώτηση σου είναι recursive , hierarchical query σε Mysql. Google it και θα το βρεις .
sp_steve Δημοσ. 4 Δεκεμβρίου 2011 Δημοσ. 4 Δεκεμβρίου 2011 Απλά μια δύο παρατηρήσεις . Δεν αναφέρεις to dbms που χρησιμοποιείς. Κάποια υποστηρίζουν hierarchical , recursive queries ενω άλλα όχι. Έτσι η απάντηση αλλάζει ανάλογα. Θα υποθέσω ότι δεν υποστηρίζει καθώς πιστεύω ότι λες για MySql . Ο πίνακας μια χαρα self referencing είναι επομένως τα δεδομένα τα βάζεις συνδέοντας κάθε category με κάποιο parent id που βρίσκεται ένα level πάνω στην ιεραρχία. To root node φυσικά θα έχει null στο parent id.Όσον αφορά την ανάκτηση δεν υποστήρίζεται native απο mysql. Μπορείς φυσικά,αν ξέρεις το βάθος εκ των προτέρων , να κάνεις τόσες φορές join τον ίδιο πίνακα και να πετύχεις τον αποτέλεσμα που θες. Διαφορετικά πρέπει να βρεις workaround. Το κλειδί στην ερώτηση σου είναι recursive , hierarchical query σε Mysql. Google it και θα το βρεις . Ευχαριστώ για την βοήθειά σου...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα