Mysql
 sql >> база данни >  >> RDS >> Mysql

Mysql Nested Select

Добавих отговор към предишния въпрос, моля, първо вижте него, за да разберете.

Не можете да го получите от bb_ratings сам, като го ГРУПИРАТЕ и хакнете. Получавате Null, защото мислите от гледна точка на мрежа, а не на релационни набори (това е централната концепция на релационния модел).

  1. Преди да решите към коя таблица(и) да отидете, за да обслужите вашата заявка, трябва да решите какво искате за структурата на вашия набор от резултати.

  2. След това го ограничете (кои редове) с WHERE клауза.

  3. След това разберете откъде (от какви таблици) да вземете колоните. Или се присъединява към повече таблици и повече работа върху WHERE клауза; или скаларни подзаявки, свързани с външната заявка.

Не сте наясно какво искате. Изглежда, че искате същия отчет като предишния въпрос, плюс колона за дадения глас на потребителите. За мен структурата на вашия набор от резултати е списък с бюлетини. Е, мога да го получа от bulletin , няма нужда да отивате на bulletin_like и след това трябва да ГРУПИРАТЕ това.

Ако мислите от гледна точка на набори, това е много лесно, няма нужда да прескачате през обръчи с материализирани изгледи или „вложени“ заявки:

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

Отговори на коментари

Имам чувството, че това, което казвате, е много важно за начина, по който подхождам към SQL

  1. Да, абсолютно. Ако желаете да научите правилните неща предварително, това ще:

    • спестите всякакви проблеми по-късно
    • направете заявките си по-ефективни
    • ви позволяват да кодирате по-бързо
      .
  2. Засега забравете за използването на набори от резултати като таблици (много по-бавно) и временни таблици (определено не се изисква, ако вашата база данни е нормализирана). Вие стемного по-добре да правите запитвания към таблиците директно. Трябва да научите различни предмети като релационния модел; как се използва SQL; какне да използвате SQL, за да избегнете проблеми; и т.н. Готов съм да ти помогна и да остана с теб известно време, но трябва да знам, че имаш желание. Ще отнеме малко напред-назад. В този сайт има малко шум, така че ще игнорирам други коментари (до края) и ще отговарям само на вашите.

    • спрете да използвате GROUP BY , това сериозно пречи на вашето разбиране на SQL. Ако не можете да получите отчета, който искате, без да използвате GROUP BY , задайте въпрос.
      .
  3. Този публикуван въпрос. Кажете ми в кой момент сте се изгубили и аз ще предоставя повече подробности от този момент нататък.

    • За този въпрос искате списък с бюлетини с харесвания; нехаресвания; и това се харесва на потребителите. Вярно ли е ? Опитахте ли кода, който предоставих?
      .
  4. Разгледах свързания въпрос. Това е бъркотия и никой не е обърнал внимание на по-дълбокия проблем; те са отговорили на проблема на повърхността, изолирано. Сега имате отговор, но не го разбирате. Това е много бавен начин за напредък.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е правилният синтаксис на израза IF в MySQL?

  2. Не мога да се свържа с '/var/run/mysqld/mysqld.sock'

  3. python models.py syncdb не работи

  4. Mysql - свържете се с отдалечен сървър, използвайки IP адрес

  5. mysql динамична заявка в съхранена процедура