sql >> Databáze >  >> RDS >> Mysql

Mysql Nested Select

Přidal jsem odpověď na předchozí otázku, pro pochopení si ji nejprve přečtěte.

Nemůžete to získat z bb_ratings sám seskupením a hackováním. Dostanete nulu, protože přemýšlíte v pojmech mřížky, nikoli relačních množin (to je ústřední koncept relačního modelu).

  1. Než se rozhodnete, do které tabulky (tabulek) přejít, abyste mohli obsloužit svůj dotaz, musíte se rozhodnout, co chcete pro strukturu sady výsledků.

  2. Pak jej omezte (které řádky) pomocí WHERE doložka.

  3. Pak zjistěte, odkud (z jakých tabulek) získat sloupce. Buď se připojí k více tabulkám a více práce na WHERE doložka; nebo skalární poddotazy, korelované s vnějším dotazem.

Nemáte jasno v tom, co chcete. Vypadá to, že chcete stejný přehled jako předchozí otázka a navíc sloupec pro hlasování daných uživatelů. Pro mě je struktura vaší sady výsledků seznamem bulletinů. Mohu to získat z bulletin , není třeba chodit na bulletin_like a pak to musíte seskupit.

Pokud uvažujete z hlediska množin, je to velmi snadné, není třeba přeskakovat obručemi se zhmotněnými pohledy nebo „vnořenými“ dotazy:

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

Odpovědi na komentáře

Mám pocit, že to, co říkáte, je velmi důležité pro to, jak přistupuji k SQL

  1. Ano absolutně. Pokud jste ochotni se předem naučit správné věci, bude to:

    • ušetříte si později všechny možné problémy
    • zefektivněte své dotazy
    • umožňují vám kódovat rychleji
      .
  2. Prozatím zapomeňte na používání výsledkových sad jako tabulek (mnohem pomalejší) a dočasných tabulek (rozhodně to není nutné, pokud je vaše databáze normalizovaná). Jste moc lepší je dotazovat se přímo na tabulky. Musíte se naučit různé předměty, jako je Relační model; jak používat SQL; jak ne používat SQL, aby se předešlo problémům; atd. Jsem ochoten vám pomoci a chvíli s vámi zůstat, ale potřebuji vědět, že jste ochoten. Bude to trvat trochu tam a zpět. Na tomto webu je trochu šumu, takže ostatní komentáře budu ignorovat (až do konce) a odpovím pouze na váš.

    • přestat používat GROUP BY , vážně to brání vašemu porozumění SQL. Pokud nemůžete požadovaný přehled získat bez použití GROUP BY , položte otázku.
      .
  3. Tato zaslaná otázka. Dejte mi vědět, kdy jste se ztratili, a od tohoto okamžiku vám poskytnu další podrobnosti.

    • Pro tuto otázku chcete seznam bulletinů s hodnocením Líbí se; nemá rád; a toto se uživatelům líbí. Je to správně ? Vyzkoušeli jste kód, který jsem vám poskytl?
      .
  4. Podívali jste se na propojenou otázku. Je to nepořádek a nikdo se nezabýval hlubším problémem; odpověděli na problém na povrchu, izolovaně. Nyní máte odpověď, ale nerozumíte jí. To je velmi pomalý způsob, jak postupovat.


  1. Nejlepší postup pro ukládání vícejazyčných řetězců

  2. Jak při vytváření materializovaného pohledu označit, že sloupec nemá hodnotu null?

  3. mysql SELECT * WHERE hodnota =$row['item']

  4. Je soubor my.ini na nesprávném místě?