Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona nidificato MySQL

Ho aggiunto una risposta alla domanda precedente, per favore fare riferimento a quella prima, per capire.

Non puoi ottenerlo da bb_ratings da solo raggruppandolo e hackerandolo. Ottieni Null perché stai pensando in termini di una griglia, non di insiemi relazionali (questo è il concetto centrale del Modello Relazionale).

  1. Prima di decidere a quale tabella andare, per soddisfare la tua query, devi decidere cosa vuoi per la struttura del tuo set di risultati.

  2. Quindi vincolalo (quali righe) con WHERE clausola.

  3. Quindi scopri da dove (da quali tabelle) prendere le colonne. O si unisce a più tabelle e più lavoro su WHERE clausola; o sottoquery scalari, correlate alla query esterna.

Non sei chiaro su cosa vuoi. Sembra che tu voglia lo stesso rapporto della domanda precedente, più una colonna per il voto dato dagli utenti. Per me, la struttura del tuo set di risultati è un elenco di bollettini. Bene, posso ottenerlo da bulletin , non c'è bisogno di andare su bulletin_like e poi devi RAGGRUPPARLO.

Se pensi in termini di set, è molto facile, non c'è bisogno di saltare attraverso i cerchi con viste materializzate o query "annidate":

SELECT name AS bulletin, 
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 1
        ) AS like,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 0
        ) AS dislike,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   bl.user_id = {$user_d}
        AND   like = 1
        ) AS your_vote
    FROM bulletin b

Risposte ai commenti

Ho la sensazione che quello che stai dicendo sia molto importante per il mio approccio a SQL

  1. Si assolutamente. Se sei disposto a imparare le cose giuste in anticipo, lo farà:

    • risparmia tutti i tipi di problemi in seguito
    • rendi le tue query più efficienti
    • consentono di codificare più velocemente
      .
  2. Per ora, dimentica di usare i set di risultati come tabelle (molto più lente) e tabelle temporanee (decisamente non necessarie se il tuo database è normalizzato). Sei molto meglio interrogare direttamente le tabelle. Devi imparare varie materie come il modello relazionale; come usare SQL; come non utilizzare SQL per evitare problemi; ecc. Sono disposto ad aiutarti e stare con te per un po', ma ho bisogno di sapere che sei disposto. Ci vorrà un po' di avanti e indietro. C'è un po' di rumore su questo sito, quindi ignorerò altri commenti (fino alla fine) e risponderò solo ai tuoi.

    • smetti di usare GROUP BY , sta seriamente ostacolando la tua comprensione di SQL. Se non riesci a ottenere il rapporto che desideri senza utilizzare GROUP BY , fai una domanda.
      .
  3. Questa domanda pubblicata. Fammi sapere a che punto ti sei perso e da quel momento in poi fornirò maggiori dettagli.

    • Per questa domanda, vuoi un elenco di bollettini, con Mi piace; antipatie; e questo piace agli utenti. È corretto ? Hai provato il codice che ti ho fornito?
      .
  4. Ho esaminato la domanda collegata. È un pasticcio e nessuno ha affrontato il problema più profondo; hanno risposto al problema in superficie, in isolamento. Ora hai una risposta ma non la capisci. Questo è un modo molto lento per progredire.