[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить подзапрос
Страницы: 1, 2, 3
sergeiss
Цитата (stump @ 10.05.2015 - 20:43)
Не лишнее ли проверка is not null?

Ты знаешь... Может и лишнее, в данном случае. Просто я в Постгре немало работал с FULL JOIN, а там такая проверка очень даже не лишняя бывает smile.gif Вот по привычке и пишу. Хуже не будет, это факт, даже ежели и лишнее.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
S.Chushkin
1) Условия задачи не полностью однозначны.
2) Reh, Вы зря сопротивляетесь sergeiss-у, его советы вполне рабочие (оба). И прежде чем утверждать, что "Так тоже не выйдет", нужно проверять. ;)
3) Совет с JOIN, я бы малость другой дал - использовать INNER JOIN, так запрос попрозрачнее/покороче.
Если надо получить все work_id в одной строке, то что-то вроде:
select t1.*, t2.work_id as work_id_2 
from ttt t1, ttt t2
where t1.work_id = 3 and
(t2.service_id = t1.service_id and t2.work_id = 6)
-- etc

4) Наиболее правильный с group by. И может быть в двух вариантах: (service_id, work_id) уникальное (достаточно =N) или не уникальное (нужно >=N).
Чтобы получить все полные записи (а не только service_id), то что-то вроде:
select t0.*, c from (
select service_id, count(service_id) c
from ttt
where work_id in (3,6)
group by service_id
having c >= 2 /* 2 это число значений в in(), если кому-то не понятно */
) t
left join ttt t0 on t0.service_id = t.service_id and t0.work_id in (3,6)


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Reh
Цитата
2) Reh, Вы зря сопротивляетесь sergeiss-у

я не сопротивляюсь, я помощи прошу))

Цитата
И прежде чем утверждать, что "Так тоже не выйдет", нужно проверять.

Дак я сначала и проверил. И когда не получилось стал думать почему.

Цитата
Если надо получить все work_id в одной строке, то что-то вроде:

Они мне вообще не нужны, мне нужен только service_id

Цитата
  where work_id in (3,6)
  group by service_id
  having c >= 2  /* 2 это число значений в in(), если кому-то не понятно */


в данной ситуации может выйти так
елси в таблице две строки service_id = 1, work_id=3 и нет строки service_id = 1, work_id=6, то такой запрос вернет строку service_id = 1, а мне надо чтобы не возвращал.

Или я ошибаюсь?
S.Chushkin
Ааа, понятно, - тогда надо чуть изменить запрос, что-то вроде:
select t0.*, c from (
select service_id, count(distinct work_id) c
from ttt
where work_id in (3,6)
group by service_id
having c = 2
) t
left join ttt t0 on t0.service_id = t.service_id and t0.work_id in (3,6)

Или, если только ИД:
  select service_id
from ttt
where work_id in (3,6)
group by service_id
having count(distinct work_id) = 2


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
sergeiss
Цитата (S.Chushkin @ 10.05.2015 - 22:44)
select service_id
  from ttt
  where work_id in (3,6)
  group by service_id
  having count(distinct work_id) = 2

Этот запрос полностью идентичен моему smile.gif Но он неправильный. Потому что, согласно утверждению ТС, может быть так, что для одно и того же service_id может быть две строки с work_id=3. И этот service_id не нужен.

PS. Или не совсем идентичен? Сейчас подумаю...

PPS. Да, согласен, так более корректно указывать COUNT().

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
S.Chushkin
Цитата (sergeiss @ 10.05.2015 - 23:24)
PPS. Да, согласен, так более корректно указывать COUNT().

Корректно, не корректно не важно - distinct позволяет решить задачу "по быстрому" и "просто". Иногда. Как в этом случае.
А насколько эффективно и корректно, это уже вторично и требует кропотливого анализа, - а оно нам надо?


_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Reh
S.Chushkin
Цитата
Или, если только ИД:
  select service_id
  from ttt
  where work_id in (3,6)
  group by service_id
  having count(distinct work_id) = 2


То что требовалось! Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.