sql >> Databasteknik >  >> RDS >> Mysql

Mysql Nested Select

Jag har lagt till ett svar på den föregående frågan, vänligen hänvisa till det först, för förståelse.

Du kan inte få det från bb_ratings ensam genom att gruppera den och hacka den. Du får Null för att du tänker i termer av ett rutnät, inte i relationsuppsättningar (det är det centrala konceptet i den relationella modellen).

  1. Innan du bestämmer dig för vilken eller vilka tabeller du ska gå till, för att betjäna din fråga, måste du bestämma vad du vill ha för strukturen för din resultatuppsättning.

  2. Begränsa det sedan (vilka rader) med WHERE klausul.

  3. Ta sedan reda på var (vilka tabeller) du ska hämta kolumnerna ifrån. Antingen ansluts till fler tabeller och mer arbete med WHERE klausul; eller skalära underfrågor, korrelerade till den yttre frågan.

Du är inte tydlig med vad du vill. Det ser ut som att du vill ha samma rapport som föregående fråga, plus en kolumn för den givna användarens röst. För mig är strukturen i din resultatuppsättning en lista med bulletiner. Tja, jag kan få det från bulletin , du behöver inte gå till bulletin_like och sedan måste GRUPPERA det.

Om du tänker i termer av uppsättningar är det väldigt enkelt, du behöver inte hoppa genom ramar med materialiserade vyer eller "kapslade" frågor:

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

Svar på kommentarer

Jag har en känsla av att det du säger är väldigt viktigt för hur jag närmar mig SQL

  1. Ja absolut. Om du är villig att lära dig rätt saker i förväg kommer det att:

    • sparar dig alla typer av problem senare
    • gör dina frågor mer effektiva
    • låter dig koda snabbare
      .
  2. Glöm nu att använda resultatuppsättningar som tabeller (mycket långsammare) och tillfälliga tabeller (definitivt inte nödvändigt om din databas är normaliserad). Du är mycket bättre att fråga tabellerna direkt. Du behöver lära dig olika ämnen såsom Relationsmodellen; hur man använder SQL; hur inte att använda SQL för att undvika problem; etc. Jag är villig att hjälpa dig och stanna hos dig ett tag, men jag behöver veta att du är villig. Det kommer att ta lite fram och tillbaka. Det är lite brus på den här webbplatsen, så jag kommer att ignorera andra kommentarer (till slutet) och bara svara på dina.

    • sluta använda GROUP BY , det hindrar allvarligt din förståelse av SQL. Om du inte kan få den rapport du vill ha utan att använda GROUP BY , ställ en fråga.
      .
  3. Denna postade fråga. Låt mig veta när du gick vilse, så kommer jag att ge mer information från den punkten och framåt.

    • För den här frågan vill du ha en lista med bulletiner, med likes; ogillar; och det här användarna gillar. Är det rätt ? Har du testat koden jag angav?
      .
  4. Tittade på den länkade frågan. Det är en röra, och ingen har tagit upp det djupare problemet; de har besvarat problemet på ytan, isolerat. Du har nu ett svar men du förstår det inte. Det är ett mycket långsamt sätt att göra framsteg.


  1. Hur hittar jag det största värdet i en kolumn i postgres sql?

  2. Hur använder man bindparam() i ett anpassat kompilerat uttryck?

  3. Hur man ökar antalet förekomster av kolumnvärde i MySQL

  4. varför delar vi upp en mysql-tabell i många mindre tabeller?