SQL Добавить столбец к результату, содержащий сумму строк в другой таблице, где соответствует запросу - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь сделать запрос SQL, который получит сумму строк в другой таблице, где столбец uuid соответствует столбцу post в столбце type, и добавит это значение в строку результатов. , Столбец type в таблице votes имеет значения 0 и 1, 0 означает -1 от суммы и 1 означает +1 к сумме баллов. После того, как все это будет завершено, я собирался отсортировать результаты в столбце score, чтобы сначала набрать наибольшее количество очков.

Если вы хотите использовать скрипту SQL, ссылка здесь: http://sqlfiddle.com/#!9/cc490b/1/0

Сокращенная версия схемы таблицы для таблицы posts:

 uuid varchar(256)
 contents text
 author varchar(256)
 comment varchar(256)
 timestamp varchar(256)
 removed varchar(256)

А схема таблицы votes:

 user varchar(256)
 post varchar(256)
 type int(1)

И так как это часть запроса, это схема таблицы follows:

 user varchar(256)
 target varchar(256)

Мой текущий запрос, чтобы получить фид сообщений, следующий, я ищу базу, если от этого:

SELECT * 
  FROM posts 
 WHERE timestamp <= ? 
   AND removed IS NULL 
   AND comment IS NULL 
   AND author IN (SELECT target 
                    FROM follows 
                   WHERE user = ? 
                   UNION 
                  SELECT ? AS target) 
 ORDER 
    BY timestamp DESC 
 LIMIT 25;

Окончательный результат ожидаемого запроса следующий:

| uuid | contents | author | comment | timestamp  | removed | score (DESC) |
| p12c | Hi!      | u7h34  | NULL    | 1560269397 | NULL    | 451          |
| p100 | Chicken  | u211f  | NULL    | 1560269417 | NULL    | 14           |

DDLS:

DROP TABLE IF EXISTS `follows`;
DROP TABLE IF EXISTS `votes`;
DROP TABLE IF EXISTS `posts`;

CREATE TABLE `follows` (
  `user` varchar(256) NOT NULL,
  `target` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `follows` (`user`, `target`) VALUES
('user-uuid2', 'user-uuid1');

CREATE TABLE `votes` (
  `user` varchar(256) NOT NULL,
  `post` varchar(256) NOT NULL,
  `type` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `votes` (`user`, `post`, `type`) VALUES
('user-uuid2', 'post-uuid9', 0),
('user-uuid2', 'post-uuid9', 1),
('user-uuid2', 'post-uuid8', 1);

CREATE TABLE `posts` (
  `uuid` varchar(256) NOT NULL,
  `contents` text NOT NULL,
  `author` varchar(256) NOT NULL,
  `comment` varchar(256) DEFAULT NULL,
  `timestamp` varchar(256) NOT NULL,
  `removed` varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `posts` (`uuid`, `contents`, `author`, `comment`, `timestamp`, `removed`) VALUES
('post-uuid1', 'Hello world1!', 'user-uuid1', NULL, '1560184505', NULL),
('post-uuid2', 'Hello world2!', 'user-uuid1', NULL, '1560184506', NULL),
('post-uuid3', 'Hello world3!', 'user-uuid1', NULL, '1560184507', NULL),
('post-uuid4', 'Hello world4!', 'user-uuid1', NULL, '1560184508', NULL),
('post-uuid5', 'Hello world5!', 'user-uuid1', NULL, '1560184509', NULL),
('post-uuid6', 'Hello world6!', 'user-uuid1', NULL, '1560184510', NULL),
('post-uuid7', 'Hello world7!', 'user-uuid1', NULL, '1560184511', NULL),
('post-uuid8', 'Hello world8!', 'user-uuid1', NULL, '1560184512', NULL),
('post-uuid9', 'Hello world9!', 'user-uuid1', NULL, '1560184513', NULL),
('post-uuid10', 'Hello world10!', 'user-uuid1', NULL, '1560184514', NULL),
('post-uuid11', 'Hello world11!', 'user-uuid1', NULL, '1560184515', NULL),
('post-uuid12', 'Hello world12!', 'user-uuid1', NULL, '1560184516', NULL);

1 Ответ

1 голос
/ 11 июня 2019

Если я что-то упустил, я думаю, вам просто нужно SUM выражения CASE.

(Я должен был закомментировать предложение WHERE, поскольку оно удаляло сообщения с помощьюголосов.)

SELECT 
   p.uuid,
   p.contents,
   p.author,
   p.comment,
   p.timestamp,
   p.removed,
   SUM(COALESCE(CASE WHEN v.type = 0 THEN -1 ELSE v.type END,0)) as Score
  FROM posts p
  LEFT JOIN votes v
    ON v.post = p.uuid
-- WHERE timestamp <= '1560184509' 
   AND removed IS NULL 
   AND comment IS NULL 
   AND author IN (SELECT target 
                    FROM follows 
                   WHERE user = '2452be00-5b48-4c09-8abb-21d469bc8e11' 
                   UNION 
                  SELECT '2452be00-5b48-4c09-8abb-21d469bc8e11' AS target) 
 GROUP BY
   p.uuid,
   p.contents,
   p.author,
   p.comment,
   p.timestamp,
   p.removed
 ORDER 
    BY Score DESC 
 LIMIT 25;

Ваша скрипка возвращается к вам: http://sqlfiddle.com/#!9/61068/8/0

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