количество строк в базе данных возвращает ноль вместо 0 - PullRequest
1 голос
/ 06 января 2020

Когда я пытаюсь подсчитать, сколько лайков у каждого пользователя, я делаю так:

SELECT likes.LI_CNT liked_count
FROM `users` 
left outer JOIN (SELECT `user_id`, COUNT(*) LI_CNT
      FROM `likes`
      GROUP BY likes.`user_id`) likes ON users.`user_id` = likes.`user_id`

Но этот запрос возвращает нулевые значения для тех пользователей, которым он не понравился любой твит вместо возврата нуля! Я пытался использовать это выражение if, но оно возвращает тот же результат (с нулевыми значениями)

COUNT(IF(likes.user_id is null, 0, 1))

моя схема таблиц:

CREATE TABLE IF NOT EXISTS `tweets` (
  `tweet_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `reply_to_tweet_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `reply_to_user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `truncated` tinyint(1) NOT NULL,
  `author` varchar(30) NOT NULL,
  `text` varchar(255) NOT NULL,
  `media` varchar(255) NOT NULL,
  `entities` json NOT NULL,
  PRIMARY KEY (`tweet_id`)
)


CREATE TABLE IF NOT EXISTS `likes` (
  `user_id` varchar(50) NOT NULL,
  `tweet_id` varchar(50) NOT NULL,
  `date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`tweet_id`)
)


CREATE TABLE IF NOT EXISTS `users` (
  `user_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `email` varchar(30) NOT NULL,
  `username` varchar(30) NOT NULL,
  `password` varchar(255) NOT NULL,
  `handelname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `account_url` varchar(255) NOT NULL,
  `bio` varchar(255) NOT NULL,
  `profile_pic` varchar(255) NOT NULL,
  `cover_pic` varchar(255) NOT NULL,
  `protected` tinyint(1) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `username` (`username`)
) 

как получить ноль вместо нуля?

1 Ответ

3 голосов
/ 06 января 2020

COUNT(*) никогда возвращает NULL значения. Но LEFT JOIN делает. Если совпадений нет, то все столбцы, включая число, будут NULL.

. Одним из решений является использование COALESCE() во внешнем SELECT:

COALESCE(LI_CNT, 0) as LI_CNT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...