Хобрук: Ваш путь к мастерству в программировании

Группировать по полю без идентификатора

У меня есть следующая настройка таблиц:

CREATE TABLE public.tags (
tag_id int4 NOT NULL,
creation_timestamp timestamp NULL,
"name" varchar(255) NULL,
CONSTRAINT tags_pkey PRIMARY KEY (tag_id)
);


-- public.tag_targets definition

-- Drop table

-- DROP TABLE public.tag_targets;

CREATE TABLE public.tag_targets (
    id int4 NOT NULL,
    creation_timestamp timestamp NULL,
    target_id int8 NULL,
    target_name varchar(255) NULL,
    last_update_timestamp timestamp NULL,
    tag_id int4 NULL,
    CONSTRAINT tag_targets_pkey PRIMARY KEY (id),
    CONSTRAINT fkcesi55mqvysjv63c1xf2j15oh FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);

Я пытаюсь выполнить следующий запрос:

SELECT *
FROM tag_targets tt, tags t 
WHERE tt.tag_id = t.tag_id
AND (t."name" IN ('Keeper', 'Pk'))
GROUP by tt.target_id

Однако он хочет, чтобы PK как тегов, так и Tagtarget в группе:

 ERROR: column "tt.id" must appear in the GROUP BY clause or be used in an aggregate function

Есть ли способ сгруппировать по столбцу target_id? Также не стесняйтесь давать какие-либо отзывы о дизайне таблицы, поскольку я выбрал общую таблицу сопоставления и таблицу независимых тегов.

24.05.2021

  • почему вы хотите сгруппировать по? покажите нам желаемый результат 25.05.2021

Ответы:


1

Проблема в том, что вы запрашиваете SELECT *, но в GROUP BY указали только tt.target_id. Вообще говоря Все имена столбцов в списке SELECT должны отображаться в GROUP BY. Упрощение: ваша база данных не знает, что делать со всеми значениями, запрошенными вами при выборе, которые не использовались в GROUP BY или любом агрегате.

Попробуйте выполнить следующий запрос, чтобы увидеть, получаете ли вы что-то

SELECT tt.target_id, count(*)
FROM tag_targets tt, tags t 
WHERE tt.tag_id = t.tag_id
AND (t."name" IN ('Keeper', 'Pk'))
GROUP by tt.target_id
24.05.2021

2

Не связанный, но ваш синтаксис table1, table2 с объединением в предложении where является синтаксисом, отличным от ANSI. Это нормально или что-то в этом роде, но синтаксис явных соединений ANSI предпочтительнее по целому ряду причин, которые я не буду вдаваться:

SELECT *
FROM
  tag_targets tt
  join tags t on
    tt.tag_id = t.tag_id
where
  t."name" IN ('Keeper', 'Pk')

На первый взгляд, когда вы говорите группа, мне интересно, имеете ли вы в виду сортировку... Я предполагаю, что вы новичок в SQL, поэтому, если это чрезмерное упрощение, простите меня, но, возможно, это было бы то, что вы хотели - порядок вместо этого группы по.

SELECT *
FROM
  tag_targets tt
  join tags t on
    tt.tag_id = t.tag_id
where
  t."name" IN ('Keeper', 'Pk')
order by
  tt.target_id

Если, с другой стороны, вам нужна только одна запись для каждого target_id (которая действительно является группой по target_id), то, возможно, это то, что вам нужно... одна запись для target_id, но тогда вам нужно определить, как расставить приоритеты какой порядок выбран. В этом примере я говорю выбрать тот, который основан на самой последней обновленной дате:

SELECT distinct on (tt.target_id)
  *
FROM
  tag_targets tt
  join tags t on
    tt.tag_id = t.tag_id
where
  t."name" IN ('Keeper', 'Pk')
order by
  tt.target_id, tt.last_update_timestamp desc

Не уверен ни в одном из этих предложений, поэтому, если они не соответствуют действительности, опубликуйте некоторые образцы данных и ожидаемые результаты.

24.05.2021
  • Придирка: неявные соединения в предложении WHERE — это соединения ANSI — только устаревшие, существовавшие до 89 года. 25.05.2021
  • Новые материалы

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..