sql >> Database >  >> RDS >> Mysql

Mysql genest selecteren

Ik heb een antwoord toegevoegd aan de vorige vraag, raadpleeg die eerst voor begrip.

Je kunt het niet krijgen van bb_ratings alleen door het te GROUPEREN en te hacken. Je krijgt Null omdat je denkt in termen van een raster, niet in relationele sets (dat is het centrale concept van het relationele model).

  1. Voordat u beslist naar welke tabel(len) u wilt gaan om uw query uit te voeren, moet u beslissen wat u wilt voor de structuur van uw resultatenset.

  2. Beperk het dan (welke rijen) met de WHERE clausule.

  3. Zoek vervolgens uit waar (welke tabellen) de kolommen vandaan moeten komen. Ofwel joins naar meer tabellen, en meer werk aan de WHERE clausule; of scalaire subquery's, gecorreleerd aan de buitenste query.

Je bent niet duidelijk over wat je wilt. Het lijkt erop dat u hetzelfde rapport wilt als de vorige vraag, plus een kolom voor de stem van de gegeven gebruikers. Voor mij is de structuur van je resultatenset een lijst met bulletins. Nou, dat kan ik halen uit bulletin , u hoeft niet naar bulletin_like . te gaan en moet dat dan GROUPEREN.

Als u in termen van sets denkt, is het heel eenvoudig, u hoeft niet door hoepels te springen met gematerialiseerde weergaven of "geneste" zoekopdrachten:

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

Reacties op opmerkingen

Ik heb het gevoel dat wat je zegt erg belangrijk is voor hoe ik SQL benader

  1. Ja absoluut. Als je bereid bent om van tevoren de juiste dingen te leren, zal het:

    • Bespaar je later allerlei problemen
    • maak uw zoekopdrachten efficiënter
    • waardoor je sneller kunt coderen
      .
  2. Vergeet voorlopig het gebruik van resultatensets als tabellen (veel langzamer) en tijdelijke tabellen (zeker niet vereist als uw database genormaliseerd is). Je bent veel beter af de tabellen rechtstreeks opvragen. Je moet verschillende vakken leren zoals het Relationele model; hoe SQL te gebruiken; hoe niet SQL gebruiken om problemen te voorkomen; enz. Ik ben bereid je te helpen en een tijdje bij je te blijven, maar ik moet weten dat je dat wilt. Het zal een beetje heen en weer gaan. Er is wat ruis op deze site, dus ik negeer andere opmerkingen (tot het einde) en reageer alleen op die van jou.

    • stop met GROUP BY , belemmert het uw begrip van SQL ernstig. Als u het gewenste rapport niet kunt krijgen zonder GROUP BY . te gebruiken , stel een vraag.
      .
  3. Deze geplaatste vraag. Laat me weten op welk punt je bent verdwaald, en ik zal vanaf dat moment meer details geven.

    • Voor deze vraag wil je een lijst met bulletins, met vind-ik-leuks; houdt niet van; en deze gebruikers houden van. Is dat correct ? Heb je de door mij verstrekte code geprobeerd?
      .
  4. Gekeken naar de gekoppelde vraag. Het is een puinhoop en niemand heeft het diepere probleem aangepakt; ze hebben het probleem aan de oppervlakte, geïsoleerd, beantwoord. Je hebt nu een antwoord, maar je begrijpt het niet. Dat is een erg langzame manier om vooruitgang te boeken.


  1. MYSQL-gegevens exporteren naar Excel/CSV via php

  2. Hoe werkt de 'in'-clausule in orakel

  3. Hoe SQL_BIG_SELECTS=1 in te stellen in Laravel Join-instructie

  4. Is de PDO-bibliotheek sneller dan de native MySQL-functies?