Страница 1 из 1

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

Добавлено: 30 июл 2007, 18:27
Unsiker
Народ помогите решить задачку, второй день ничего не идет.

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

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

Добавлено: 30 июл 2007, 18:28
Unsiker
Например

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

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

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

Добавлено: 30 июл 2007, 19:39
WildSery
Чуть моск не вывихнул, пытаясь понять логическую зависимость параметра "два" и результата "один - 1; десять - 2".

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

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

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

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

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

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

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

Добавлено: 31 июл 2007, 10:38
WildSery
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

Добавлено: 31 июл 2007, 12:56
stix-s
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 дырками и будет на весь мир обижен, что не работает :)

Добавлено: 31 июл 2007, 13:15
Unsiker
Обьясните что в этом примере означаетит t2 и каково ее предначение.

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

Добавлено: 31 июл 2007, 14:11
stix-s
Unsiker писал(а):Обьясните что в этом примере означаетит t2 и каково ее предначение.

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

Добавлено: 31 июл 2007, 15:37
Unsiker
два часа убил на вот это:
создал таблицу: "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"
постоянная ошибка, запрос не выполняется :(

Добавлено: 31 июл 2007, 15:49
WildSery
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

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

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

Добавлено: 31 июл 2007, 16:25
Attid
Unsiker
а может ты раскажешь что хочешь сделать?
один\два и т.д. это банки с медом или отметки или еще чего ?
потому что то что ты хочешь получить как-то похоже больше на то что ты пытаешься птичку замучить =)

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

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