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 в этой конкретной строке, а не во всех. Заранее спасибо Андрей

2 ответа

Решение

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

Вы не можете получить это от 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. Посмотрел на связанный вопрос. Это беспорядок, и никто не обратился к более глубокой проблеме; они ответили на проблему на поверхности, в изоляции. Теперь у вас есть ответ, но вы его не понимаете. Это очень медленный путь к прогрессу.

$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, тогда я получаю нулевое значение для всех полей thisUsersRating.

Другие вопросы по тегам