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

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

Δημοσ.

Καλησπέρα!

Έχουμε τον ακόλουθο πίνακα table με τα εξής columns:
id,threadid,outbid_threadid

Αυτό που θέλω είναι να τραβάω με μια SELECT τα δεδομένα του πίνακα και οι γραμμές που έχουν ταίριασμα (threadid και outbid_threadid) να εμφανίζονται/αποκλείονται με τον εξής τρόπο:
Αν έχουμε στον πίνακα τα δεδομένα:
1,308,0
2,307,0
3,306,0
4,336,306

Θα πρέπει να επιστραφούν μόνο οι γραμμές:
1,308,0
2,307,0
4,336,306

Πως συντάσσω το query ;

Με άλλα λόγια αν υπάρχει τιμή στο outbid_threadid, έχει προτεραιότητα στην επιστροφή και το αντίστοιχο threadid του πίνακα δε θα πρέπει να επιστρέφεται.

Δημοσ.

Θα πρέπει να παίξεις με το WHERE.

 

Συνήθως από ότι καταλαβαίνω θές στο Where Clause να έχει μια συνθήκη που να ελέγχσει ότι το ID είνα κάτι. Το παράδειγμά σου καταλαβαίνω  ότι υσχύει ένα η παραπάνω (ή και κανένα) από αυτά:

  • Το ID να είναι δύναμη του 2
  • Το ID να μην είναι 3
  • Το ID να μην είναι Πολ/σιο του 3

Αν είχε τις εγγραφές (το παράδειγμά σου συν τυχαία δεδομένα):

 

1,308,0
2,307,0
3,306,0
4,336,306

5,12,-6000

6,33,5

9,66,12

16,25,42

90,44,5

17,6,9

99999,-1234,7

.

.

.

Ποιες θα ήθελες?

Δημοσ.

Καλησπέρα!

Λοιπόν, το id δεν έχει καμία σχέση με τους ελέγχους που πρέπει να γίνονται, είναι απλά μια auto increment τιμή (έχεις δίκιο πάντως που σε μπέρδεψε μιας που το έβαλα ως δεδομένο στο πρόβλημα).

 

Οπότε το ερώτημα είναι:

Αν υπάρχει τιμή στο outbid_threadid, έχει προτεραιότητα στην επιστροφή και το αντίστοιχο threadid του πίνακα δε θα πρέπει να επιστρέφεται

 

Άλλα παραδειγματικά δεδομένα:

Αν έχουμε στον πίνακα τα δεδομένα:
1,308,0
2,307,0
3,306,0
4,336,306

5,205,0

6,209,0

7,219,209

8,456,0

9,567,456

10,799,0

Θα πρέπει να επιστραφούν μόνο οι γραμμές:
1,308,0
2,307,0
4,336,306

5,205,0

7,219,209

9,567,456

10,799,0

 

Ουσιαστικά εξαιρέσαμε τις τιμές threadid που έχουν αντιστοιχία σε outbid_threadid. ;)

Δημοσ.

Δεν δίνεις αρκετές πληροφορίες. Το ζεύγος (threadid, outbid_threadid) είναι unique? Τι γίνεται αν υπάρχουν πολλά μη-μηδενικά outbid_threadid για το ίδιο threadid? Και γιατί έχεις μηδενικά εκεί αντί για null? Μήπως η κατάσταση περιλαμβάνει έξτρα "χρονολογικά" δεδομενά τα οποία δε μας λες? (π.χ. ότι το nonzero outbid_threadid πάντα θα έχει μεγαλύτερο id από το zero outbid_threadid, κάτι που ισχύει σε όλα τα παραδείγματά σου).

Δημοσ.

Το ζεύγος threadid, outbid_threadid είναι πράγματι unique. Και το threadid είναι unique στον πίνακα.

Οπότε δεν πρόκειται να υπάρχουν πολλά μη-μηδενικά outbid_threadid για το ίδιο threadid.

πχ δεν θα βρεις τα ακόλουθα δεδομένα στον πίνακα:

1,308,0
2,307,0
3,306,0
4,336,306

5,451,306

 

Όχι, δεν υπάρχει κάποια σχέση μεγαλύτερου ή μικρότερου στοιχείου.

 

;)

Δημοσ.

Ίσως κάτι μου λέει Καρτεσιανό γινόμενο. Έστω 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
Δημοσ.

Για δοκίμασε το παρακάτω:

 

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
)

Δεν ξέρω αν είναι σωστό αλλά νομίζω είμαι κοντά

Δημοσ.
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!

Δημοσ.

Βρίσκεις ποιά είναι τα 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 δεν έχει λόγο ύπαρξης.

Δημοσ.

Λοιπόν παιδιά, το 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 ()).

 

Ευχαριστώ πολύ :-)

Δημοσ. (επεξεργασμένο)

Λοιπόν παιδιά, το 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 :)

Επεξ/σία από chrism4111

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...