[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить подзапрос
Страницы: 1, 2, 3
Reh
sergeiss
Тогда так и сделаю!

ps не занаю откуда(
Наверно еще не выработалось расставлять кавычки только там где они нужны
Reh
sergeiss
Цитата
Можно и упростить smile.gif Это ж просто, "как дважды два":

select service_id, group_concat( work_id )
from services
where work_id in (3,6)
group by service_id
having count(service_id) = 2


К сожалению, такой вариант не подойдет.
В таблице могут дублироваться строки с одинаковыми service_id и work_id,
блок WHERE выбирет все правильно, а вот HEVING отсеет часть нужного, так как строк
может быть не две а 8 или 10.

Как еще можно поступить?
sergeiss
Цитата (Reh @ 10.05.2015 - 14:06)
К сожалению, такой вариант не подойдет.
В таблице могут дублироваться строки с одинаковыми service_id и work_id,

Ну так думать надо тогда. И кстати, использование LEFT JOIN тоже неправильное будет, скорее всего, при дублировании по этим критериям.
У них в чем еще разница, у этих данных?

PS. Хорошо. В выражении "having count(service_id) = 2" поставь не "равно", а "больше или равно".

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

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

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

user posted image
Reh
Цитата
И кстати, использование LEFT JOIN тоже неправильное будет, скорее всего


Непойму почему, мы же все дубли потом через GROUP BY уберем.

Цитата
У них в чем еще разница, у этих данных?

Есть еще один столбец, в нем и есть разница, но его данные в этом запросе не используются.
Reh
Цитата
PS. Хорошо. В выражении "having count(service_id) = 2" поставь не "равно", а "больше или равно".

Точно!!! Нам же надо убрать все что меньше!
Еще раз спасибо!
Reh
Цитата
PS. Хорошо. В выражении "having count(service_id) = 2" поставь не "равно", а "больше или равно".


Так тоже не выйдет(((

Например

where work_id in (3,6) по =3 мы выберем три строки, а по =6 ниодной.
блок HAVING это пропустит так как он проверит count(service_id) >=2.
sergeiss
Reh, в таком случае надо задействовать третье поле, по которому можно различить эти разные состояния при одинаковых service_id и work_id. Что за поле, какие там значения?

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

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

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

user posted image
Reh
Цитата
Что за поле, какие там значения?


Первое поле service_id, второе work_id (малярные работы, и тд), третье поле work_detail_id (покраска, полировка и тд).

Нужно, например, выбрать все service_id которые занимаются малярными работами и ремонтом электрики одновременно(то-есть по столбику work_id).
sergeiss
Reh, тогда формируй запрос также, как я в самом начале темы показал. С джойнами.

select s1.service_id

from services s1
left join services s2
left join services s3
...

on
s1.service_id = s2.service_id and
s1.service_id = s3.service_id and
...

where
s1.work_id=3 and
s2.work_id=6 and
s3.work_id=7 and
...
s1.work_id is not null and
s2.work_id is not null and
s3 work_id is not null
...

Вобщем-то, в ПХП будет очень просто сформировать такой запрос. implode() тебе в руки.

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

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

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

user posted image
AllesKlar
Цитата (Reh @ 9.05.2015 - 18:51)
AllesKlar
Цитата
Тебе именно пары значений нужны или только service_id?


Мне нужны только service_id, приетом только те, которые имеют определенные work_id.
work_id прописаны в массиве, их может быть 25 штук, а может и 1.

Не понимаю, что вы тут городите уже несколько дней.
Ему же не нужны пары, ему нужны только значения одного столбца.
Я еще 3 дня назад запрос написал:

SELECT service_id
FROM table
WHERE
work_id = 3 OR work_id = 6 OR work_id = ... OR work_id = n
GROUP BY service_id


Или я что-то не понимаю в обсуждаемом? :blink:

_____________
[продано копирайтерам]
sergeiss
Цитата (AllesKlar @ 10.05.2015 - 18:53)
Или я что-то не понимаю в обсуждаемом?

Не понимаешь smile.gif

Ему надо выбрать не просто те service_id, где есть искомые значения. А те service_id, для которых в разных строках есть одновременно весь набор нужных данных. То есть, например, если указаны work_id = 3 или 6, то надо выбрать service_id 1 и 9 (из данных, показанных в примере в начале). 11 и 12 не годятся, т.к. у них есть только по одному work_id из искомых. По твоему же запросу они тоже будут выбраны.

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

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

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

user posted image
AllesKlar
а... пардоньте.

_____________
[продано копирайтерам]
Reh
Цитата
Или я что-то не понимаю в обсуждаемом? blink.gif


наверно.

Объясню еще. Имеем массив $work

array(3) {
[0]=>
string(1) "2"
[1]=>
string(1) "3"
[2]=>
string(2) "28"
}

Мне нужно выбрать только те service_id, которые имеют work_id = 2, work_id = 3, work_id = 28

Если в таблице нету work_id = 28, но есть work_id = 2, work_id = 3 то этот service_id нам не нужен. Мы ищем service_id, если только он присутствует в таблице со всеми work_id = 2, work_id = 3, work_id = 28
stump
Цитата (sergeiss @ 10.05.2015 - 18:50)
Reh, тогда формируй запрос также, как я в самом начале темы показал. С джойнами.

select s1.service_id

from services s1
left join services s2
left join services s3
...

on
s1.service_id = s2.service_id and
s1.service_id = s3.service_id and
...

where
s1.work_id=3 and
s2.work_id=6 and
s3.work_id=7 and
...
s1.work_id is not null and
s2.work_id is not null and
s3 work_id is not null
...

Вобщем-то, в ПХП будет очень просто сформировать такой запрос. implode() тебе в руки.

Как work_I'd может одновременно иметь значение 3 и быть null? Не лишнее ли проверка is not null?

_____________
Трус не играет в хокей
Reh
Цитата
Reh, тогда формируй запрос также, как я в самом начале темы показал. С джойнами.


Так и поступлю!
Быстрый ответ:

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