Зарос на выборку

Модераторы: kdv, CyberMax

Ответить
Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Зарос на выборку

Сообщение Unsiker » 30 июл 2007, 18:27

Народ помогите решить задачку, второй день ничего не идет.

У меня есть определенная таблица с 2-х полей (ID, text). значения поля text очень часто повторяются так как это выборка одного из 10 слов ("один", "два", ...., "десять").

как мне построить зарос таким образом что при указании параметра (определенного слова - одного из 10) запрос подщитывал количество совпадений предыдущих слов.

Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Сообщение Unsiker » 30 июл 2007, 18:28

Например

Table1:
ID text
1 один
2 два
3 один
4 десять
5 два
6 десять
7 два

после выполнения с параметром "один " должно выйти:
два - 1
остальное нули ...
после выполнения с параметром "два " должно выйти:
один - 1
десять - 2
остальное нули

_______
желательно использовать только SQL

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 30 июл 2007, 19:39

Чуть моск не вывихнул, пытаясь понять логическую зависимость параметра "два" и результата "один - 1; десять - 2".

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 31 июл 2007, 05:49

WildSery писал(а):Чуть моск не вывихнул, пытаясь понять логическую зависимость параметра "два" и результата "один - 1; десять - 2".
Если я его себе правильно вывихнул, то автору надо вывести количество энтих самых слов, не совпадающих с параметром, но не общим чохом, а с группировкой.
типа:

Код: Выделить всё

select count(text),text from table 
where
 text<>:InputPapam group by text
Хотяяяяяя, могет и не так :) телепатию только изучаю :)

Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Сообщение Unsiker » 31 июл 2007, 09:38

to "WildSery":
см. в таблицу: предполагаем что InputPapam = "два"
в даной таблице он встречается 3 раза с ID: 2, 5, 7
Мне нужно все что идет над этим параметром, тоесть ID: 1, 4, 6.
Дальше смотрим что идет под этим ID:
1 один
4 десять
6 десять
после производится групировка, сколько чего встречается. как видно "десять" встречается 2 раза, а "один" - 1 раз.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 31 июл 2007, 10:01

Дааа. Жизненная задачка.
Ну что ж. Всё элементарно - JOIN табличку саму с собой по условию ID = ID-1, группировка с подсчётом.

Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Сообщение Unsiker » 31 июл 2007, 10:14

Чуть моск не вывихнул, пытаясь понять: JOIN табличку саму с собой по условию ID = ID-1, группировка с подсчётом. С етого места можно поподробнее

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 31 июл 2007, 10:23

Unsiker писал(а):Чуть моск не вывихнул, пытаясь понять: JOIN табличку саму с собой по условию ID = ID-1, группировка с подсчётом. С етого места можно поподробнее
мона еще задачку для моска подкину?
еще все желаемое можно процедурой сделать, прям по желаемому алгоритму, по шагам, так сказать

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 31 июл 2007, 10:38

Unsiker писал(а):Чуть моск не вывихнул, пытаясь понять: JOIN табличку саму с собой по условию ID = ID-1, группировка с подсчётом. С етого места можно поподробнее
Сарказм неуместен.
Я уверен, что многие меня поняли. А вот твоё условие действительно было запутанным. Тому, кто учиться не любит, готовое решение. Хотел как лучше.

Код: Выделить всё

select t2.text, count(1)
  from table t1
       join table t2 on t2.id = t1.id+1
  where t1.text = :param
  group by t2.text

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 31 июл 2007, 12:56

WildSery писал(а):Сарказм неуместен.
Я уверен, что многие меня поняли. А вот твоё условие действительно было запутанным. Тому, кто учиться не любит, готовое решение. Хотел как лучше.

Код: Выделить всё

select t2.text, count(1)
  from table t1
       join table t2 on t2.id = t1.id+1
  where t1.text = :param
  group by t2.text
Вот возьмет афтарррр, сделает ID c дырками и будет на весь мир обижен, что не работает :)

Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Сообщение Unsiker » 31 июл 2007, 13:15

Обьясните что в этом примере означаетит t2 и каково ее предначение.

___
я так понимаю это еще одна таблица?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 31 июл 2007, 14:11

Unsiker писал(а):Обьясните что в этом примере означаетит t2 и каково ее предначение.

___
я так понимаю это еще одна таблица?
ты прав, это еще одна таблица, и нужна она именно для этого:
http://ibase.ru/devinfo/joins.htm - ссылка вроде очевидней некуда :)
Может прочтешь? не будешь обижаться, что я тебе содержание по данному линку в этот топ не скопировал?

Unsiker
Сообщения: 18
Зарегистрирован: 17 июл 2007, 18:07

Сообщение Unsiker » 31 июл 2007, 15:37

два часа убил на вот это:
создал таблицу: "Table2" (ID, text, count)
Запрос
select
"Table2"."text",
count(1)
from "Table1"
join "Table2" ON ("Table2"."ID" = "Table1"."ID"-1)
where "Table1"."text" = "два"
group by "Table2"."text"
постоянная ошибка, запрос не выполняется :(

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 31 июл 2007, 15:49

stix-s писал(а):Вот возьмет афтарррр, сделает ID c дырками и будет на весь мир обижен, что не работает :)
Какая задача, такое и решение :wink:
Ладно, пусть так. Наверное, он уже прочитал про JOIN. Теперь добавим нового синтаксиса.

Код: Выделить всё

select t2.text, count(1)
  from table t2
       join (select max(t1.id) id
              from table t
                   join table t1 on t1.id < t.id
              where t.text = :param
              group by t.id) t3
       on t2.id = t3.id
  group by 1

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 31 июл 2007, 15:52

Unsiker писал(а):постоянная ошибка, запрос не выполняется :(
Хм. Дай подумать... 120! Угадал?

Кстати, кто тебя так научил, все идентификаторы в кавычках писать?

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 31 июл 2007, 16:25

Unsiker
а может ты раскажешь что хочешь сделать?
один\два и т.д. это банки с медом или отметки или еще чего ?
потому что то что ты хочешь получить как-то похоже больше на то что ты пытаешься птичку замучить =)

кста табличку создовать не надо было, надо было почитать про альясы.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 31 июл 2007, 17:36

Unsiker писал(а): два часа убил на вот это:
создал таблицу: "Table2" (ID, text, count)
постоянная ошибка, запрос не выполняется :(
мало, надо недельки 2 помаяться и доку НЕ ЧИТАТЬ!
WildSery писал(а): Ладно, пусть так. Наверное, он уже прочитал про JOIN.
готов поспорить на съедение треуголки что он тут ваще ниче не читал
Attid писал(а): один\два и т.д. это банки с медом или отметки или еще чего ?
Это камни, которые кидают в тех, кто не хочет на форуме помогать активно (ну я например)

Ответить