Mysql Nested Select

Следуя этому вопросу last_question с этой таблицей

`id`, `bbs_id`, `user_id`, `like_dislike`
(15,   4,        2,         0),
(14,   4,        1,         0),
(13,   3,        1,         0),
(12,   2,        1,         1),
(11,   1,        2,         0),
(10,   1,        1,         1);

Как я могу видеть, что понравилось или не понравилось отдельным пользователям? Допустим, я хотел иметь сводную таблицу всех симпатий и антипатий с другим столбцом, понравилось ли пользователю x.

Это запрос, который я пробовал

$user_id = 1;


SELECT bbs_id,
     (SELECT like_dislike FROM bb_ratings WHERE user_id={$user_id}) AS thisUsersRating,
       SUM(CASE WHEN like_dislike = 1 THEN 1 ELSE 0 END) AS likes, 
       SUM(CASE WHEN like_dislike = 0 THEN 1 ELSE 0 END) AS dislikes
FROM bb_ratings
GROUP BY bbs_id

Я предполагаю, что проблема, с которой я столкнулся, заключается в том, как вы относитесь к user_id = x в этой конкретной строке, а не ко всем строкам. Заранее спасибо Эндрю

Ответ 1

Я добавил ответ на предыдущий вопрос, пожалуйста, обратитесь к первому, для понимания.

Вы не можете получить его от bb_ratings только путем его создания и взлома. Вы получаете Null, потому что вы думаете в терминах сетки, а не реляционных множеств (то есть центральной концепции реляционной модели).

  • Прежде чем вы решите, в какую таблицу перейти, чтобы обслуживать ваш запрос, вам нужно решить, что вы хотите для структуры вашего набора результатов.

  • Затем ограничьте его (строки) с помощью предложения WHERE.

  • Затем выясните, где (какие таблицы) получить столбцы. Либо присоединяется к большему количеству таблиц, и больше работает над предложением WHERE; или скалярные подзапросы, соотнесенные с внешним запросом.

Вы не знаете, что хотите. Похоже, вам нужен тот же отчет, что и предыдущий вопрос, плюс столбец для данных пользователей. Для меня структура вашего результирующего набора - это список бюллетеней. Ну, я могу получить это из bulletin, не нужно идти в bulletin_like, а затем для GROUP это.

Если вы думаете в терминах множеств, это очень просто, нет необходимости перепрыгивать через обручи с материализованными представлениями или "вложенными" запросами:

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

  • Да, абсолютно. Если вы хотите изучить правильные вещи спереди, это будет:

    • сэкономить все возможные проблемы.
    • сделать ваши запросы более эффективными
    • позволяет быстрее закодировать код ,
  • Пока забудьте о том, как использовать результирующие наборы в виде таблиц (гораздо медленнее) и временных таблиц (определенно не требуется, если ваша база данных нормализована). Вы намного лучше запрашиваете таблицы напрямую. Вам нужно изучить различные предметы, такие как реляционная модель; как использовать SQL; как не использовать SQL, чтобы избежать проблем; и т.д. Я готов помочь вам и остаться с вами на некоторое время, но мне нужно знать, что вы готовы. Это займет немного времени. На этом сайте немного шума, поэтому я буду игнорировать другие комментарии (до конца) и отвечать только на ваши.

    • Прекратить использование GROUP BY, это серьезно затрудняет ваше понимание SQL. Если вы не можете получить требуемый отчет без использования GROUP BY, задайте вопрос.
      .
  • Этот вопрос. Сообщите мне, в какой момент вы заблудились, и я подробно расскажу о нем с этой точки.

    • Для этого вопроса вам нужен список бюллетеней с симпатией; антипатии; и этим пользователям нравится. Это верно? Вы пробовали код, который я предоставил?
      .
  • Посмотрел на связанный вопрос. Это беспорядок, и никто не обратился к более глубокой проблеме; они ответили на проблему изолированно. Теперь у вас есть ответ, но вы этого не понимаете. Это очень медленный путь прогресса.

Ответ 2

$user_id = 1

SELECT bbs_id,
       sum(CASE WHEN user_id = {$user_id} THEN like_dislike END) AS thisUsersRating,
       SUM(CASE WHEN like_dislike = 1 THEN 1 ELSE 0 END) AS likes, 
       SUM(CASE WHEN like_dislike = 0 THEN 1 ELSE 0 END) AS dislikes
FROM bb_ratings
GROUP BY bbs_id

Дает мне

bbs_id     thisUsersRating  likes         dislikes
    (1,         '1',            '1',             '1'),
    (2,         '1',            '1',             '0'),
    (3,         '0',            '0',             '1'),
    (4,         '0',            '0',             '2');

Если я изменю user_id на 4, я получаю null для всех полей thisUsersRating.