Ερώτημα για MySql
Δημοσιεύτηκε: 16 Απρ 2019, 19:40
Προσπαθώ να γράψω ένα mysql select query και δεν μου βγαίνει, μπορεί να βοηθήσει κανείς;
Υπάρχει πίνακας (έστω my_table) που έχει column με unique index (έστω id1) αλλά όχι auto_increment, οπότε οι τιμές του id1 μπορεί να είναι οποιοσδήποτε integer (μοναδικές, βέβαια).
Θέλω να μπορώ να βρω το επόμενο ελεύθερο id, ξεκινώντας από κάποιο σαν βάση (starting point), είτε προς τα πάνω είτε προς τα κάτω.
Παράδειγμα:
Έστω ότι ο id1 έχει τις τιμές 5, 6, 7, 8, 13, 14, 15, 45, 78.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 6, θα πρέπει να φέρει το 9.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 11, θα πρέπει να φέρει το 11.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 123, θα πρέπει να φέρει το 123.
Αν θέλω να βρω τον προηγούμενο ελεύθερο αριθμό ξεκινώντας από 15, θα πρέπει να φέρει το 9.
Αν θέλω να βρω τον προηγούμενο ελεύθερο αριθμό ξεκινώντας από 8, θα πρέπει να φέρει το 4.
κ.ο.κ...
Προσπάθησα με το παρακάτω:
...αλλά δεν παίρνω το επιθυμητό αποτέλεσμα. Κατ' αρχάς δεν μπορώ να ορίσω starting point, αλλά πέρα απ' αυτό, το παραπάνω query βρίσκει πάντα το πρώτο ελεύθερο id μετά από κάποιο υπαρκτό id (λογικό βέβαια, έτσι όπως είναι γραμμένο).
Έχω δοκιμάσει και κάποιες παραλλαγές με MIN(id1) κλπ αντί για LIMIT 1, αλλά το αποτέλεσμα είναι το ίδιο.
Υπάρχει βέβαια λύση με ορισμό μεταβλητής όπως πχ εδώ:
και στο "@var=1" να δίνω το starting point, αλλά έχω έναν περιορισμό. Πρέπει να γίνει όλο σε μία γραμμή, δεν μπορώ να χρησιμοποιήσω πολλαπλές σειρές (δηλαδή με ';') για κάποιον λόγο.
Μπορεί κανείς να βοηθήσει; Θενκς εκ των προτέρων...
Υπάρχει πίνακας (έστω my_table) που έχει column με unique index (έστω id1) αλλά όχι auto_increment, οπότε οι τιμές του id1 μπορεί να είναι οποιοσδήποτε integer (μοναδικές, βέβαια).
Θέλω να μπορώ να βρω το επόμενο ελεύθερο id, ξεκινώντας από κάποιο σαν βάση (starting point), είτε προς τα πάνω είτε προς τα κάτω.
Παράδειγμα:
Έστω ότι ο id1 έχει τις τιμές 5, 6, 7, 8, 13, 14, 15, 45, 78.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 6, θα πρέπει να φέρει το 9.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 11, θα πρέπει να φέρει το 11.
Αν θέλω να βρω τον επόμενο ελεύθερο αριθμό ξεκινώντας από 123, θα πρέπει να φέρει το 123.
Αν θέλω να βρω τον προηγούμενο ελεύθερο αριθμό ξεκινώντας από 15, θα πρέπει να φέρει το 9.
Αν θέλω να βρω τον προηγούμενο ελεύθερο αριθμό ξεκινώντας από 8, θα πρέπει να φέρει το 4.
κ.ο.κ...
Προσπάθησα με το παρακάτω:
Κώδικας: Επιλογή όλων
SELECT t1.`id1` + 1
FROM `my_table` t1
LEFT JOIN `my_table` t2 ON t1.`id1` + 1 = t2.`id1`
WHERE t2.`id1` IS NULL
ORDER BY t1.`id1` ASC
LIMIT 1
Έχω δοκιμάσει και κάποιες παραλλαγές με MIN(id1) κλπ αντί για LIMIT 1, αλλά το αποτέλεσμα είναι το ίδιο.
Υπάρχει βέβαια λύση με ορισμό μεταβλητής όπως πχ εδώ:
Κώδικας: Επιλογή όλων
SET @var=1;
SELECT IF(@var=`id1`,@var:=`id1`+1,@var) FROM `my_table` ORDER BY `id1`;
SELECT @var;
Μπορεί κανείς να βοηθήσει; Θενκς εκ των προτέρων...