Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Akis_gr49 » 22 Ιουν 2011 09:40

Γεια σας παιδιά,

Θα ήθελα λίγο τα φώτα σας στο παρακάτω sql ερώτημα γιατί έχω κολλήσει και δεν ξεκολλάω με τίποτα.

Θέλω να πάρω όλα τα user_id που ανήκουν στο "x" forum_id.

ΠΙΝΑΚΑΣ (2 πεδία)
user_id============forum_ids
30============1,2,7,6,10
40============1,2,9
50============1,3,5,8
60============5,7
70============5
80============4,10


για παράδειγμα: θέλω να πάρω το εξής αποτελέσματα:

για το 1 forum_id: έχω τα user_id 30,40,50

2: 30,40
3: 50
4: 80
5: 50
6: 30
7: 30,60
8: 50
9: 40
10: 30,80

Το θέμα είναι ότι κολλάω στο κόμμα "," που υπάρχει στην 1,2,7 και 10 row.

Οποιαδήποτε ιδέα, βοήθεια ευπρόσδεκτη.

Ευχαριστώ παιδιά εκ των προτέρων.[/b]

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από jpk » 22 Ιουν 2011 10:56

Αν τώρα το φτιάχνεις , η άποψή μου είναι ότι δεν είναι καλή ιδέα να έχεις σε ένα πεδίο – column ids χωρισμένα με κόμματα. Αν είναι κάτι που συντηρείς αλλά έχεις την δυνατότητα να το επανασχεδιάσεις (χωρίς να υποφέρεις 30 meetings) σκέψου το. Η άλλη λύση είναι αρκετά απλή, ID , USER_ID , FORUM_ID , το ID μοναδικό πρωτεύων … και ένα μοναδικό index πάνω στο USER_ID μαζί με το FORUM_ID.

Από εκεί και πέρα αν δεν μπορείς, και το forum_ids έτσι όπως το δίνεις είναι text (ή varchar) και έχεις σε κάποιον άλλον πίνακα τα forum_ids τότε πρέπει να κάνεις αναζήτηση κειμένου. Αν είναι αυτή η περίπτωση πες λίγα περισσότερα για το αν ήδη έχεις τα forum_ids από άλλον πίνακα να προτείνουμε ερώτημα (σε γενικές γραμμές αυτό που σκέφτομαι είναι με forum_id x: Αν το forum_ids αρχίζει με "x," ή εμπεριέχει ",x," ή τελειώνει σε ",x")

edit: Καθαρά από περιέργεια το δοκίμασα φτιάχνοντας έναν πίνακα forums μόνο με ID τον πίνακα που περιέγραψες τον είπα users. Σίγουρα μπορεί να γραφτεί καθαρότερα…

Κώδικας: Επιλογή όλων

SELECT a.ID, GROUP_CONCAT( b.user_id ) AS FORUM_USERS
FROM forums AS a
LEFT JOIN users AS b ON ( b.forum_ids LIKE CONCAT( a.ID, ',%' )
OR b.forum_ids LIKE CONCAT( '%,', a.ID, ',%' )
OR b.forum_ids LIKE CONCAT( '%,', a.ID ) )
GROUP BY a.ID
Πάντως πραγματικά σκέψου τον επανασχεδιασμό …

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Akis_gr49 » 22 Ιουν 2011 16:31

jpk σ' ευχαριστώ για την απάντηση και την βοήθειά σου.

Είμαι ακόμη σε αρχικό στάδιο και μπορώ να επανασχεδιάσω την βάση.

Προτείνεις δηλαδή να δημιουργήσω έναν πίνακα forums, έναν πίνακα users και έναν πίνακα user_forums οι οποίοι θα είναι ως εξής; :


Users
user_id
user_name

Forums
forum_id
forum_title

user_forums
id
user_id
forum_id

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από jpk » 22 Ιουν 2011 16:53

Να είσαι καλά , κάπως έτσι , φυσικά θα υπάρχουν και πολλά άλλα πεδία – columns σε κάθε πίνακα από αυτούς (εκτός από τον user_forums) ανάλογα με τις ανάγκες σου . Αν και το το query που είχα στο προηγούμενο post λειτουργεί σε καλούς χρόνους δεν θα συνεχίσουν να είναι καλοί όσο αυξάνονται οι χρήστες και τα forums.

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

edit: Στα ονόματα πινάκων και στηλών καλό είναι να ακολουθούμε κάποιους κοινούς κανόνες π.χ. τα ονόματα των πινάκων μπορούν να είναι με μικρά και τα ονόματα των πεδίων με κεφαλαία, επίσης δεν υπάρχει λόγος να λες user_id στον πίνακα users αρκεί να το πεις ID και αν θέλεις να γίνει πιο κατανοητό σε κάποιο join μην με πολλά AS απλά χρησιμοποίησε τα ονόματα των πινάκων (ακόμα και με AS αν θέλεις). (αυτά είναι συμβάσεις αλλά πίστεψε με, βοηθά να έχεις ενιαίες). Φυσικά στους πίνακες που κάνουν reference σε άλλους πίνακες έχει νόημα να πεις USER_ID για παράδειγμα (θα μπορούσες να ορίσεις και αυτή την σχέση μέσα στον ίδιο τον ορισμό του πίνακα). Επαναλαμβάνω ότι αυτά είναι απλά απόψεις.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από pimpogio » 22 Ιουν 2011 19:25

η βαση σου ειναι προβληματικη και θελει κανονικοποιηση...
jpk έγραψε:Αν τώρα το φτιάχνεις , η άποψή μου είναι ότι δεν είναι καλή ιδέα να έχεις σε ένα πεδίο – column ids χωρισμένα με κόμματα. Αν είναι κάτι που συντηρείς αλλά έχεις την δυνατότητα να το επανασχεδιάσεις (χωρίς να υποφέρεις 30 meetings) σκέψου το. Η άλλη λύση είναι αρκετά απλή, ID , USER_ID , FORUM_ID , το ID μοναδικό πρωτεύων … και ένα μοναδικό index πάνω στο USER_ID μαζί με το FORUM_ID.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Apostolis_38 » 22 Ιουν 2011 20:26

Akis_gr49 έγραψε:Προτείνεις δηλαδή να δημιουργήσω έναν πίνακα forums, έναν πίνακα users και έναν πίνακα user_forums
Αλλος τρόπος είναι να παραλείψεις τον πίνακα users_forums και να φτιάξεις τον forums με πεδία user_id, forum_id, forum_title και primary key τον συνδυασμό user_id,forum_id.

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Akis_gr49 » 22 Ιουν 2011 21:01

Ευχαριστώ παιδιά. Γνωρίζω για την κανονικοποίηση αλλά δεν ξέρω γιατί έκανα την βλακεία και το ξεκίνησα έτσι, ίσως λόγω τα ταχύτητας, ευκολίας κτλ.

Να είστε καλά για τις πολύτιμες συμβουλές σας. Ευχαριστώ και πάλι όλους. :)

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από pimpogio » 23 Ιουν 2011 07:35

Apostolis_38 έγραψε:
Akis_gr49 έγραψε:Προτείνεις δηλαδή να δημιουργήσω έναν πίνακα forums, έναν πίνακα users και έναν πίνακα user_forums
Αλλος τρόπος είναι να παραλείψεις τον πίνακα users_forums και να φτιάξεις τον forums με πεδία user_id, forum_id, forum_title και primary key τον συνδυασμό user_id,forum_id.
μην το κανεις αυτο.. ειπαμε κανονικοποίηση
Akis_gr49 έγραψε:jpk σ' ευχαριστώ για την απάντηση και την βοήθειά σου.

Είμαι ακόμη σε αρχικό στάδιο και μπορώ να επανασχεδιάσω την βάση.

Προτείνεις δηλαδή να δημιουργήσω έναν πίνακα forums, έναν πίνακα users και έναν πίνακα user_forums οι οποίοι θα είναι ως εξής; :


Users
user_id
user_name

Forums
forum_id
forum_title

user_forums
id
user_id
forum_id
σε αυτο η αλλαγη που θα κανεις ειναι
user_forums
user_id
forum_id

PK(user_id,forum_id) -> συνδιασμενο ΠΚ

το id ειναι πλεονασμος και δε χρειαζεται..

Akis_gr49
Δημοσιεύσεις: 266
Εγγραφή: 07 Ιουν 2007 13:49

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Akis_gr49 » 23 Ιουν 2011 07:54

Άψογα pimpogio, σ' ευχαριστώ. Έτσι θα το κάνω. Έβαλα και το id στο user_forums αλλά απ' ότι βλέπω όντως δεν χρειάζεται πουθενά νομίζω.

Ευχαριστώ και πάλι, καλή συνέχεια!

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Apostolis_38 » 23 Ιουν 2011 10:13

pimpogio έγραψε:
Apostolis_38 έγραψε:Αλλος τρόπος είναι να παραλείψεις τον πίνακα users_forums και να φτιάξεις τον forums με πεδία user_id, forum_id, forum_title και primary key τον συνδυασμό user_id,forum_id.
μην το κανεις αυτο.. ειπαμε κανονικοποίηση

:D :D :D :D

Για δώσε μου έναν καλό λόγο να μην το κάνει.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από pimpogio » 23 Ιουν 2011 11:41

καθε forum εχει απο 0 εως Ν χρηστες
οποτε για να βαζεις χρηστη στο καθε forum
θα πρεπει να επαναλαμβανεις το forum_tile
το οποιο ειναι πλεονασμος και παραβιαζει την 2η κανονικη μορφη..
Η κανονικοποιηση ειναι καθαρα μια μαθηματικη θεωρια και μπορεις να την περιγραψεις
με απλα λογια οτι δεν υπαρχουνε πλεοναζοντα δεδομενα και η βαση ειναι ασφαλης απο ανωμαλιες στα δεδομενα.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Apostolis_38 » 23 Ιουν 2011 12:14

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


Μιλάμε για την συγκεκριμένη περίπτωση βέβαια, κι όχι γενικά.
Εν πάσει περιπτώσει, οπως γουστάρει ο καθένας.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από pimpogio » 23 Ιουν 2011 12:46

δεν παιζει σημασια μονο ο αριθμος των πινακων αλλα
και το payload τους...
το payload ειναι μικρο οταν κανουμε με ints με varchars
ειναι πολυ μεγαλυτερο.

τι ειναι ποιο ευκολο πχ να ταξινομησεις/αναζητησεις n strings και 100n ints
η 100n strings ?

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από Apostolis_38 » 23 Ιουν 2011 12:55

Μα δεν κάνεις αναζήτηση με το forum_title που είναι character.

Κάνεις με το concat(user_id,forum_id) και απλώς πετάς το forum_title σαν περιγραφή.
Αν θέλεις φυσικά.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Sql ερώτημα - 2 fields, 1 table - LEFT JOIN και GROUP

Δημοσίευση από pimpogio » 23 Ιουν 2011 14:41

αν με βρει ο chuck norris και μου πει
να κανω με τον τιτλο ταξινομηση και δεν κανει γρηγορα θα με καθαρισει. :(

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες