powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите объединить 2 запроса
9 сообщений из 9, страница 1 из 1
Помогите объединить 2 запроса
    #38613005
cr@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 3 таблицы. Связаны они 1-ко-многим
Главная таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE TABLE _jant
(
  id serial NOT NULL,
  article text,
  name text,
  fav boolean DEFAULT false,
  CONSTRAINT _jant_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE _jant
  OWNER TO postgres;
GRANT ALL ON TABLE _jant TO public;
GRANT ALL ON TABLE _jant TO postgres;

CREATE INDEX _jant_article_idx
  ON _jant
  USING btree
  (article COLLATE pg_catalog."default");

CREATE INDEX _jant_name_idx
  ON _jant
  USING btree
  (name COLLATE pg_catalog."default");


Детальная таблица 1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
CREATE TABLE _jant_d
(
  id serial NOT NULL,
  id_article integer,
  pricedate date,
  cost text,
  CONSTRAINT _jant_d_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE _jant_d
  OWNER TO postgres;
GRANT ALL ON TABLE _jant_d TO public;
GRANT ALL ON TABLE _jant_d TO postgres;

CREATE INDEX _jant_d_id_article_pricedate_idx
  ON _jant_d
  USING btree
  (id_article, pricedate);

CREATE INDEX _jant_d_pricedate_idx
  ON _jant_d
  USING btree
  (pricedate);

CREATE INDEX d_jant_d_id_article_idx
  ON _jant_d
  USING btree
  (id_article);


Детальная таблица 2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TABLE _jant_cross1
(
  id serial NOT NULL,
  id_for_detail integer,
  shop text,
  id_in_shop integer
)
WITH (
  OIDS=FALSE
);
ALTER TABLE _jant_cross1
  OWNER TO postgres;
GRANT ALL ON TABLE _jant_cross1 TO public;
GRANT ALL ON TABLE _jant_cross1 TO postgres;

CREATE INDEX "IDIDFD"
  ON _jant_cross1
  USING btree
  (id_for_detail);

CREATE INDEX id
  ON _jant_cross1
  USING btree
  (id);



Частично суть вопроса я уже излагал в этой теме (только сейчас задача усложнилась).
Надо вывести список товаров из таблицы _jant, последнюю цену этого товара (см. запрос 1) и кол-во подчинённых записей (см. запрос 2)
Запрос 1 (последняя цена на товар)
Код: sql
1.
2.
3.
4.
5.
SELECT a.id, a.article, a.name, b.cost
FROM  _jant  a
LEFT JOIN _jant_d b ON b.id_article = a.id AND b.pricedate=(SELECT MAX(pricedate) FROM _jant_d LIMIT 1)
WHERE (b.cost IS NOT NULL)
ORDER BY a.name



Запрос 2 (кол-во подчинённых записей)
Код: sql
1.
2.
3.
4.
select _jant.name, COUNT(*)
FROM _jant_cross1 
INNER JOIN _jant ON _jant.id= _jant_cross1.id_for_detail
GROUP BY _jant.id 



Никак не могу объединить эти два запроса в один
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613087
тупо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cr@nk<;>
Никак не могу объединить эти два запроса в один

тупо это делается через корелляты (выборкой по главной).
типа
Код: sql
1.
2.
3.
4.
,(SELECT цена FROM прайс 
        WHERE прайс.товар=товары.товар 
           AND цена is not null ORDER BY "дата прайса" DESC LIMIT 1)
    AS "последняя цена"


то же - можно и с кол-вом лавок по товару.

но т.к. вам надо всю таблу обсчитать, а не малое подмн-во, то сделайте 2 свертки деталей по id товара, и заджойните результат на главную по id.
что-то типа ваших запросов, но id товара в обоих оставьте до джойна.

только, с учетом фичь пж сворачивать цену по прайсам можно фичёй
Код: sql
1.
2.
3.
SELECT DISTINCT ON(товар)  товар,цена FROM прайс
[WHERE цена IS NOT NULL]
 ORDER BY товар, "дата прайса" DESC


где ORDER BY есть значимая часть DISTINCT ON()

//в некоторых частных случаях кореллят выиграет.
ЗЫ: за
Код: sql
1.
cost text

надо яйца отрывать на месте
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613112
cr@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тупоЗЫ: за
Код: sql
1.
cost text

надо яйца отрывать на месте
Если бы цена всегда была просто числом... очень часто вместо цены пишут дог., call или 150руб
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613175
cr@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё равно что-то не выходит составить запрос (
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613190
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы цена всегда была просто числом... очень часто вместо цены пишут дог., call или 150руб
Так нужно их заставить писать цифрой. ну а если нужна какая-то пометка то доп строку дать им.
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613194
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри,
цена у тебя может быть только положительным значением. значит у тебя есть возможность использовать цифры со знаком минус
тип numeric используй.

я использую
-1 - что то значит
-2 - еще что то значит
-3 - заметка из такого то поля к этому товару.
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613197
cr@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну заставить не вариант :)
Да и в данном контексте тип поля не важен. Он же никак не влияет на составление запроса

P.S.: По теме. Пробовал решить вопрос запросами вида SELECT FROM SELECT , но опыта в составлении сложных запросов совсем нет, поэтому выходит всякая фигня :(
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613309
cr@nk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось решить. Вдруг кому-то потребуется аналогичное решение
Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.id, a.article, a.name, b.cost, (select COUNT(*) FROM _jant_cross1 WHERE a.id= _jant_cross1.id_for_detail
GROUP BY a.id ) d
FROM  _jant  a
LEFT JOIN _jant_d b ON b.id_article = a.id AND b.pricedate=(SELECT MAX(pricedate) FROM _jant_d LIMIT 1)
WHERE (b.cost IS NOT NULL)
ORDER BY a.name
...
Рейтинг: 0 / 0
Помогите объединить 2 запроса
    #38613356
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cr@nkтупоЗЫ: за
Код: sql
1.
cost text

надо яйца отрывать на месте
Если бы цена всегда была просто числом... очень часто вместо цены пишут дог., call или 150руб
а это [дог., call] другие поля .
"тип цены", "валюта" , и т.п. атри,простите,буты

но если вам цифирь (т.е. не учитываем ничего, а только ценники печатаем) не нужна - то и не важно

ps
ваше "открытие" можно крутить и та и эдак, нет там никакой тайны

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT a.id, a.article, a.name, b.cost
    ,d.cnt
 /*, (select COUNT(*) FROM _jant_cross1 WHERE a.id= _jant_cross1.id_for_detail
GROUP BY a.id ) d*/ -- спускаем кореллят в JOIN
FROM  _jant  a
/*LEFT -- если нужны NULL-магазины */
  JOIN (select id_for_detail AS id, COUNT(*) as cnt FROM  _jant_cross1 
      GROUP BY id_for_detail ) d USING(id)
LEFT JOIN _jant_d b ON b.id_article = a.id AND b.pricedate=(SELECT MAX(pricedate) FROM _jant_d LIMIT 1)
WHERE (b.cost IS NOT NULL) /* ???? не хотите NULL уберите LEFT*/
ORDER BY a.name
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите объединить 2 запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]