philos Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 Καλησπέρα!Έχουμε τον ακόλουθο πίνακα table με τα εξής columns:id,threadid,outbid_threadidΑυτό που θέλω είναι να τραβάω με μια SELECT τα δεδομένα του πίνακα και οι γραμμές που έχουν ταίριασμα (threadid και outbid_threadid) να εμφανίζονται/αποκλείονται με τον εξής τρόπο:Αν έχουμε στον πίνακα τα δεδομένα:1,308,02,307,03,306,04,336,306Θα πρέπει να επιστραφούν μόνο οι γραμμές:1,308,02,307,04,336,306Πως συντάσσω το query ; Με άλλα λόγια αν υπάρχει τιμή στο outbid_threadid, έχει προτεραιότητα στην επιστροφή και το αντίστοιχο threadid του πίνακα δε θα πρέπει να επιστρέφεται.
PC_MAGAS Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 Θα πρέπει να παίξεις με το WHERE. Συνήθως από ότι καταλαβαίνω θές στο Where Clause να έχει μια συνθήκη που να ελέγχσει ότι το ID είνα κάτι. Το παράδειγμά σου καταλαβαίνω ότι υσχύει ένα η παραπάνω (ή και κανένα) από αυτά: Το ID να είναι δύναμη του 2 Το ID να μην είναι 3 Το ID να μην είναι Πολ/σιο του 3 Αν είχε τις εγγραφές (το παράδειγμά σου συν τυχαία δεδομένα): 1,308,02,307,03,306,04,336,306 5,12,-6000 6,33,5 9,66,12 16,25,42 90,44,5 17,6,9 99999,-1234,7 . . . Ποιες θα ήθελες?
philos Δημοσ. 6 Μαρτίου 2015 Μέλος Δημοσ. 6 Μαρτίου 2015 Καλησπέρα! Λοιπόν, το id δεν έχει καμία σχέση με τους ελέγχους που πρέπει να γίνονται, είναι απλά μια auto increment τιμή (έχεις δίκιο πάντως που σε μπέρδεψε μιας που το έβαλα ως δεδομένο στο πρόβλημα). Οπότε το ερώτημα είναι: Αν υπάρχει τιμή στο outbid_threadid, έχει προτεραιότητα στην επιστροφή και το αντίστοιχο threadid του πίνακα δε θα πρέπει να επιστρέφεται Άλλα παραδειγματικά δεδομένα: Αν έχουμε στον πίνακα τα δεδομένα:1,308,02,307,03,306,04,336,306 5,205,0 6,209,0 7,219,209 8,456,0 9,567,456 10,799,0Θα πρέπει να επιστραφούν μόνο οι γραμμές:1,308,02,307,04,336,306 5,205,0 7,219,209 9,567,456 10,799,0 Ουσιαστικά εξαιρέσαμε τις τιμές threadid που έχουν αντιστοιχία σε outbid_threadid.
defacer Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 Δεν δίνεις αρκετές πληροφορίες. Το ζεύγος (threadid, outbid_threadid) είναι unique? Τι γίνεται αν υπάρχουν πολλά μη-μηδενικά outbid_threadid για το ίδιο threadid? Και γιατί έχεις μηδενικά εκεί αντί για null? Μήπως η κατάσταση περιλαμβάνει έξτρα "χρονολογικά" δεδομενά τα οποία δε μας λες? (π.χ. ότι το nonzero outbid_threadid πάντα θα έχει μεγαλύτερο id από το zero outbid_threadid, κάτι που ισχύει σε όλα τα παραδείγματά σου).
philos Δημοσ. 6 Μαρτίου 2015 Μέλος Δημοσ. 6 Μαρτίου 2015 Το ζεύγος threadid, outbid_threadid είναι πράγματι unique. Και το threadid είναι unique στον πίνακα. Οπότε δεν πρόκειται να υπάρχουν πολλά μη-μηδενικά outbid_threadid για το ίδιο threadid. πχ δεν θα βρεις τα ακόλουθα δεδομένα στον πίνακα: 1,308,02,307,03,306,04,336,306 5,451,306 Όχι, δεν υπάρχει κάποια σχέση μεγαλύτερου ή μικρότερου στοιχείου.
PC_MAGAS Δημοσ. 6 Μαρτίου 2015 Δημοσ. 6 Μαρτίου 2015 Ίσως κάτι μου λέει Καρτεσιανό γινόμενο. Έστω Table ο πίνακας σου Select Table.id as id,Table.threadid as threadid,Table.outbid_threadid as outbid_threadid from Table,Table as a Where Table.threadid = a.outbid_threadid
chrism4111 Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 Για δοκίμασε το παρακάτω: SELECT t3.id, t3.threadid, t3.outbid_threadid FROM `yourtable` as t3 WHERE t3.threadid NOT IN ( SELECT t2.outbid_threadid FROM `yourtable` as t1 INNER JOIN `yourtable` AS t2 ON t1.threadid = t2.outbid_threadid ) Δεν ξέρω αν είναι σωστό αλλά νομίζω είμαι κοντά
defacer Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 SELECT * FROM foobar WHERE id NOT IN (SELECT a.id FROM foobar a INNER JOIN foobar b ON a.threadid = b.outbid) Το ίδιο πράγμα με του chris ουσιαστικά. Βρίσκεις ποιά είναι τα id (ή threadid, δεν έχει σημασία αφού το threadid είναι unique, οπότε αλήθεια το σκέτο id τι σκοπό εξυπηρετεί?) που εμφανίζονται σα νούμερα και στο threadid και στο outbid και τα αποκλείεις από τα αποτελέσματα. Φρόντισε να έχεις index σε όλα τα columns!
chrism4111 Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 Βρίσκεις ποιά είναι τα id (ή threadid, δεν έχει σημασία αφού το threadid είναι unique, οπότε αλήθεια το σκέτο id τι σκοπό εξυπηρετεί?) που εμφανίζονται σα νούμερα και στο threadid και στο outbid και τα αποκλείεις από τα αποτελέσματα. Φρόντισε να έχεις index σε όλα τα columns! Το ζεύγος threadid, outbid_threadid είναι πράγματι unique. Και το threadid είναι unique στον πίνακα. Οπότε δεν πρόκειται να υπάρχουν πολλά μη-μηδενικά outbid_threadid για το ίδιο threadid. πχ δεν θα βρεις τα ακόλουθα δεδομένα στον πίνακα: 1,308,0 2,307,0 3,306,0 4,336,306 5,451,306 Όχι, δεν υπάρχει κάποια σχέση μεγαλύτερου ή μικρότερου στοιχείου. Όπως λέει και ο Defacer φρόντισε να έχεις index σε όλα τα πεδία Αυτό που κατάλαβα και θα έκανα στην θέση σου : primary key - id auto increment unique_id_1 - threadid, outbid_threadid unique_id_2 - outbid_threadid Το id ίσως να χρειάζεται για άλλη συσχέτιση με κάποιον άλλον πίνακα. Αν δεν υπάρχει κάποια συσχέτιση τότε το id δεν έχει λόγο ύπαρξης.
philos Δημοσ. 7 Μαρτίου 2015 Μέλος Δημοσ. 7 Μαρτίου 2015 Λοιπόν παιδιά, το id τελικά δε χρειάζεται (το έβαλα από συνήθεια). Θα ήθελα μερικές πληροφορίες σχετικά με το πως να δομήσω τον πίνακα και πως τρέχω τα mysql queries για INSERT και UPDATE. Υποθέτω ότι μια κίνηση για αρχή είναι να αφαιρέσω το column id και να εφαρμόσω τα παρακάτω: unique_id_1 - threadid, outbid_threadidunique_id_2 - outbid_threadid Από εκεί και ύστερα, πως κάνω INSERT και UPDATE χωρίς να μου βγάλει error η MySQL για duplicates? Νομίζω παλιά σε μια παρόμοια περίπτωση χρησιμοποιούσα την REPLACE αλλά δεν είμαι σίγουρος. Συνήθως δούλευα με πίνακες που είχαν id - AUTO INCREMENT. Τέλος, αν αφαιρέσω το column id, με ποιο query θα μπορώ να παίρνω τα ίδια αποτελέσματα (εφόσον πλέον δε μπορώ να κάνω id NOT IN ()). Ευχαριστώ πολύ
chrism4111 Δημοσ. 7 Μαρτίου 2015 Δημοσ. 7 Μαρτίου 2015 (επεξεργασμένο) Λοιπόν παιδιά, το id τελικά δε χρειάζεται (το έβαλα από συνήθεια). Θα ήθελα μερικές πληροφορίες σχετικά με το πως να δομήσω τον πίνακα και πως τρέχω τα mysql queries για INSERT και UPDATE. Υποθέτω ότι μια κίνηση για αρχή είναι να αφαιρέσω το column id και να εφαρμόσω τα παρακάτω: unique_id_1 - threadid, outbid_threadid unique_id_2 - outbid_threadid Από εκεί και ύστερα, πως κάνω INSERT και UPDATE χωρίς να μου βγάλει error η MySQL για duplicates? Νομίζω παλιά σε μια παρόμοια περίπτωση χρησιμοποιούσα την REPLACE αλλά δεν είμαι σίγουρος. Συνήθως δούλευα με πίνακες που είχαν id - AUTO INCREMENT. Τέλος, αν αφαιρέσω το column id, με ποιο query θα μπορώ να παίρνω τα ίδια αποτελέσματα (εφόσον πλέον δε μπορώ να κάνω id NOT IN ()). Ευχαριστώ πολύ Αυτό δεν βολεύει? SELECT t3.threadid, t3.outbid_threadid FROM `yourtable` as t3 WHERE t3.threadid NOT IN ( SELECT t2.outbid_threadid FROM `yourtable` as t1 INNER JOIN `yourtable` AS t2 ON t1.threadid = t2.outbid_threadid ) Όπως είπα και παραπάνω καθώς όπως είπε και ο Defacer θα πρέπει να ορίσεις indexes **** Διόρθωση Ποια πεδία δεν θες Duplicate και θες να είναι UNIQUE ξεκαθάρισέ το λίγο αυτό? Τέλος τώρα αφού δεν έχεις το ID λογικά μπορείς να βάλεις : PRIMARY_KEY (threadid, outbid) - UNIQUE (threadid) ή PRIMARY_KEY (threadid) - UNIQUE (threadid, outbid) Τι ενvoείς οτι δεν θες να λαμβάνεις σφάλμα για τα DUPLICATES Μήπως λες οτι αν είναι DUPLICATE μια εγγραφή στο INSERT να κάνει UPDATE? Πολύ γενικά νομίζω πως θα μπορούσες να κάνεις κάτι τέτοιο INSERT INTO `table` (threadid, outbid) VALUES (336,306) ON DUPLICATE KEY UPDATE outbid = 306; Το παραπάνω αν βρεί DUPLICATE αυτή την εγγραφή για οποιοδήποτε λόγo πήγαινε και κάνε UPDATE στην εγγραφή αυτήν που βρήκε DUPLICATE και κάνε το outbid = 306. Αν δε βρει DUPLICATE τότε κάνε κανονικά την εισαγωγή. Εαν κάνω λάθος για το παραπάνω διορθώστε με. Δεν θυμάμε καλά έχω καιρό να μπλεξω βαθιά με την SQL Επεξ/σία 8 Μαρτίου 2015 από chrism4111
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα