Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zagnieżdżone MySQL Wybierz

Dodałem odpowiedź na poprzednie pytanie, proszę odnieść się najpierw do tego w celu zrozumienia.

Nie możesz tego uzyskać z bb_ratings sam, grupując go i hakując. Otrzymujesz wartość Null, ponieważ myślisz w kategoriach siatki, a nie zbiorów relacyjnych (jest to centralna koncepcja modelu relacyjnego).

  1. Zanim zdecydujesz, do których tabel się udać, aby obsłużyć zapytanie, musisz zdecydować, co chcesz dla struktury zestawu wyników.

  2. Następnie ogranicz go (które wiersze) za pomocą WHERE klauzula.

  3. Następnie zastanów się, skąd (z jakich tabel) pobrać kolumny. Albo dołącza do większej liczby tabel i więcej pracy na WHERE klauzula; lub podzapytania skalarne, skorelowane z zapytaniem zewnętrznym.

Nie masz jasności co do tego, czego chcesz. Wygląda na to, że chcesz ten sam raport, co w poprzednim pytaniu, plus kolumnę na głos danego użytkownika. Dla mnie struktura twojego zestawu wyników to lista biuletynów. Cóż, mogę to uzyskać z bulletin , nie ma potrzeby przechodzenia do bulletin_like a następnie trzeba to pogrupować.

Jeśli myślisz w kategoriach zestawów, jest to bardzo proste, nie ma potrzeby przeskakiwania przez obręcze z widokami zmaterializowanymi lub zapytaniami „zagnieżdżonymi”:

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

Odpowiedzi na komentarze

Mam wrażenie, że to, co mówisz, jest bardzo ważne dla tego, jak podchodzę do SQL

  1. Tak, absolutnie. Jeśli chcesz nauczyć się właściwych rzeczy z góry, to:

    • zaoszczędzę ci później wszelkiego rodzaju problemów
    • poprawić wydajność zapytań
    • umożliwiają szybsze kodowanie
      .
  2. Na razie zapomnij o używaniu zestawów wyników jako tabel (znacznie wolniej) i tabel tymczasowych (zdecydowanie nie jest to wymagane, jeśli Twoja baza danych jest znormalizowana). Jesteś dużo lepiej odpytywać tabele bezpośrednio. Musisz nauczyć się różnych przedmiotów, takich jak model relacyjny; jak używać SQL; jak nie używać SQL, aby uniknąć problemów; itd. Chętnie ci pomogę i zostanę z tobą przez jakiś czas, ale muszę wiedzieć, że jesteś chętny. Zajmie to trochę tam iz powrotem. Na tej stronie jest trochę zamieszania, więc zignoruję inne komentarze (do końca) i odpowiem tylko na twoje.

    • przestań używać GROUP BY , poważnie utrudnia zrozumienie języka SQL. Jeśli nie możesz uzyskać żądanego raportu bez użycia GROUP BY , zadaj pytanie.
      .
  3. To zamieściło pytanie. Daj mi znać, w którym momencie się zgubiłeś, a od tego momentu podam więcej szczegółów.

    • W przypadku tego pytania potrzebna jest lista biuletynów z polubieniami; nie lubi; i to lubi użytkownicy. Czy to jest poprawne ? Czy wypróbowałeś podany przeze mnie kod?
      .
  4. Przejrzałem pytanie, do którego prowadzi link. Jest bałagan i nikt nie zajął się głębszym problemem; rozwiązali problem na powierzchni, w odosobnieniu. Masz teraz odpowiedź, ale jej nie rozumiesz. To bardzo powolny sposób na postęp.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać dane wyjściowe w formacie tabeli z MySQL w trybie nieinteraktywnym?

  2. MySQL dławiący się kręconymi (inteligentnymi) cytatami

  3. GROUP_CONCAT i INNER JOIN z klauzulą ​​WHERE

  4. przechowuj wiele wartości pól wyboru w bazie danych za pomocą php i mysql

  5. Logika zapytań SQL dla początkujących z 3 tabelami