#sql #sqlite
Вопрос:
Таблица articles
содержит 2 строки. Когда я группируюсь по article.id
, мой результат содержит только 1 строку, хотя второй идентификатор статьи тоже должен быть там:
sqlite> select * from articles;
e5c90df1-d525-46f8-9747-ea2939b8011d|||2021-08-06 18:25:00|2021-08-08 05:53:35.115709|
69c7b4d4-8c43-4f97-acdf-b620dbd528dc|||2021-09-17 21:25:00|2021-09-18 08:38:40.919855|
sqlite> select * from comments;
sqlite> SELECT t1.id, COUNT(t2.id) AS comment_count
...> FROM articles AS t1
...> LEFT JOIN comments AS t2 ON (t2.article_id = t1.id)
...> GROUP BY t2.article_id;
69c7b4d4-8c43-4f97-acdf-b620dbd528dc|0
sqlite> SELECT t1.id, COUNT(t2.id) AS comment_count
...> FROM articles AS t1
...> LEFT JOIN comments AS t2 ON (t2.article_id = t1.id)
...> WHERE t1.id = 'e5c90df1-d525-46f8-9747-ea2939b8011d'
...> GROUP BY t2.article_id
...> ;
e5c90df1-d525-46f8-9747-ea2939b8011d|0
Вот тестовая база данных:
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "articles" (
"id" VARCHAR(255) NOT NULL,
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "comments" (
"id" VARCHAR(255) NOT NULL,
"article_id" VARCHAR(255) NOT NULL,
PRIMARY KEY("id")
);
INSERT INTO "articles" VALUES ('e5c90df1-d525-46f8-9747-ea2939b8011d');
INSERT INTO "articles" VALUES ('69c7b4d4-8c43-4f97-acdf-b620dbd528dc');
COMMIT;
Комментарии:
1. Вы уверены, что такое поведение воспроизводимо?
2. @TimBiegeleisen Я не знаю, что еще я мог бы сделать, чтобы гарантировать это. Я вижу это в скрипте Python, в браузере Sqlite и в командной строке. Я добавил в вопрос SQL для создания тестовой базы данных.
3. Почему вы группируетесь по t2.article_id, а не t1.id?
4. Проверьте это: db-fiddle.com/f/jsXBmi5YPAhr7KznaowCcq/0
5. @forpas Да, это работает, спасибо! Теперь мне нужно понять, почему это так… Это упрощенный запрос из более сложной версии, где мне нужно подсчитать количество комментариев на статью. Поэтому я подумал, что логичнее сгруппироваться по
comments.article_id
.