Η συσσωμάτωση με δύο συνενώσεων (MySQL)

ψήφοι
2

Έχω ένα πίνακα που ονομάζεται γκαλερί . Για κάθε σειρά στην γκαλερί υπάρχουν αρκετές σειρές στον πίνακα της εικόνας . Μια εικόνα ανήκει σε μία γκαλερί. Στη συνέχεια, υπάρχει ο πίνακας ψηφοφορίας . Εκεί κάθε σειρά είναι μια Ψήφος ή downvote για ένα συγκεκριμένο γκαλερί. Εδώ είναι η (απλοποιημένα) δομή:

gallery ( gallery_id )
picture ( picture_id, picture_gallery_ref )
vote ( vote_id, vote_value, vote_gallery_ref )

Τώρα θέλω ένα ερώτημα για να μου δώσει τις ακόλουθες πληροφορίες: Όλες οι αίθουσες με τα δικά τους πεδία δεδομένων και τον αριθμό των εικόνων που συνδέονται με την γκαλερί και την sumarized αξία των ψήφων.

Εδώ είναι το ερώτημα μου, αλλά λόγω των πολλών που ενώνει τα συγκεντρωτικά οι τιμές δεν είναι οι σωστές. (Τουλάχιστον, όταν υπάρχουν περισσότερες από μία σειρά είτε φωτογραφίες ή ψήφους.)

SELECT 
  *, SUM( vote_value ) as score, COUNT( picture_id ) AS pictures
FROM 
  gallery
LEFT JOIN 
  vote
  ON gallery_id = vote_gallery_ref
LEFT JOIN 
  picture
  ON gallery_id = picture_gallery_ref
GROUP BY gallery_id

Επειδή έχω παρατηρήσει ότι COUNT( DISTINCT picture_id )μου δίνει το σωστό αριθμό των εικόνων προσπάθησα αυτό:

( SUM( vote_value ) / GREATEST( COUNT( DISTINCT picture_id ), 1 ) ) AS score

Λειτουργεί σε αυτό το παράδειγμα, αλλά τι γίνεται αν υπήρχαν περισσότερες ενώνει σε ένα ερώτημα;

Απλά θέλω να ξέρω αν υπάρχει μια καλύτερη ή πιο «κομψό» τρόπο αυτό το πρόβλημα μπορεί να λυθεί. Επίσης, θα ήθελα να ξέρω αν η λύση μου είναι MySQL, ειδική ή πρότυπο SQL;

Δημοσιεύθηκε 18/02/2009 στις 19:09
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
5

Αυτό το απόσπασμα από τον William του Okham ισχύει και εδώ:

Enita μη sunt multiplicanda praeter necessitatem

(Λατινικά για «οντότητες δεν πρέπει να πολλαπλασιάζονται πέραν της αναγκαιότητας»).

Θα πρέπει να επανεξετάσει γιατί θα πρέπει αυτό να γίνει σε ένα και μόνο ερώτημα; Είναι αλήθεια ότι ένα μόνο ερώτημα έχει λιγότερη επιβάρυνση από πολλαπλά ερωτήματα, αλλά αν η φύση της και μόνο ερώτημα γίνεται πολύ περίπλοκο, τόσο για να αναπτύξει, καθώς και για το RDBMS για να εκτελέσει, στη συνέχεια, εκτελέστε ξεχωριστά ερωτήματα.

Απαντήθηκε 18/02/2009 στις 19:30
πηγή χρήστη

ψήφοι
3

Ή απλά χρησιμοποιήστε υποερωτήματα ...

Δεν ξέρω αν αυτό ισχύει σύνταξη MySQL, αλλά ίσως να είναι σε θέση να κάνει κάτι παρόμοιο με:

SELECT
  gallery.*, a.score, b.pictures
LEFT JOIN
(
  select vote_gallery_ref, sum(vote_value) as score
  from vote
  group by vote_gallery_ref
) a ON gallery_id = vote_gallery_ref
LEFT JOIN 
(
  select picture_gallery_ref, count(picture_id) as pictures
  from picture
  group by picture_gallery_ref
) b ON gallery_id = picture_gallery_ref
Απαντήθηκε 18/02/2009 στις 19:42
πηγή χρήστη

ψήφοι
0

Όπως δήλωσε ο Bill Karwin, να κάνει όλα αυτά μέσα σε ένα ερώτημα είναι αρκετά άσχημο.

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

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

select g.gallery_id, g.name, g.state, i.num_pictures, j.sum_vote_values
from gallery g
inner join (
  select g.gallery_id, count(p.picture_id) as 'num_pictures'
  from gallery g
  left join picture p on g.gallery_id = p.picture_gallery_ref
  group by g.gallery_id) as i on g.gallery_id = i.gallery_id
left join (
  select g.gallery_id, sum(v.vote_value) as 'sum_vote_values'
  from gallery g
  left join vote v on g.gallery_id = v.vote_gallery_ref
  group by g.gallery_id
) as j on g.gallery_id = j.gallery_id

Αυτό θα δώσει ένα σύνολο αποτελεσμάτων που μοιάζει με:

gallery_id, name, state, num_pictures, sum_vote_values
1, 'Gallery A', 'NJ', 4, 19
2, 'Gallery B', 'NY', 3, 32
3, 'Empty gallery', 'CT', 0, 
Απαντήθηκε 18/02/2009 στις 19:46
πηγή χρήστη

ψήφοι
1

Πόσο συχνά μπορείτε να προσθέσετε / αλλάξετε αρχεία ψηφοφορία;

Πόσο συχνά μπορείτε να προσθέσετε / αφαιρέσετε αρχεία εικόνας;

Πόσο συχνά να εκτελέσετε το ερώτημα για αυτά τα σύνολα;

Θα μπορούσε να είναι καλύτερη για τη δημιουργία συνολικά πεδία στον πίνακα γκαλερί ( total_pictures, total_votes, total_vote_values).

Όταν προσθέσετε ή να αφαιρέσετε μια εγγραφή στον πίνακα της εικόνας μπορείτε επίσης να ενημερώσετε το σύνολο πάνω στο τραπέζι γκαλερί. Αυτό μπορεί να γίνει με τη χρήση ωθήσεις στο τραπέζι εικόνα για να ενημερώνει αυτόματα τον πίνακα γκαλερί. Θα μπορούσε επίσης να γίνει χρησιμοποιώντας μια συναλλαγή που συνδυάζει δύο SQL δηλώσεις για την ενημέρωση του πίνακα εικόνα και τον πίνακα γκαλερί. Όταν προσθέτετε μια εγγραφή στον πίνακα της εικόνας αυξάνει το total_picturesπεδίο πάνω στο τραπέζι γκαλερί. Όταν διαγράφετε μια εγγραφή στον πίνακα της εικόνας ελαττώσει το total_picturesπεδίο.

Παρομοίως, όταν ένα αρχείο ψηφοφορίας προστίθεται ή αφαιρείται ή οι vote_valueαλλαγές να ενημερώσετε το total_votesκαι total_vote_valuesπεδία. Προσθέτοντας ένα αρχείο αυξάνει το total_votesπεδίο και προσθέτει vote_valuesστο total_vote_values. Διαγραφή ρεκόρ απομειώνει τον total_votesτομέα και αφαιρεί vote_valuesαπό το total_vote_values. Ενημέρωση vote_valuesσχετικά με ρεκόρ ψήφου πρέπει επίσης να ενημερώσετε total_vote_valuesμε την διαφορά (αφαιρούμε παλιά τιμή, προσθέτουν νέα τιμή).

Το ερώτημά σας γίνεται πλέον ασήμαντο - είναι ακριβώς ένα απλό ερώτημα από το τραπέζι γκαλερί. Αλλά αυτό είναι εις βάρος των πιο πολύπλοκων ενημερώσεις των πινάκων εικόνα και να ψηφίσουν.

Απαντήθηκε 18/02/2009 στις 20:10
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more