Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];

Вниз

Вложенный запрос   Найти похожие ветки 

 
Alex86   (2008-09-19 12:21) [0]

Помогите объединить в один запрос тк не сильно знаком с sql:

SQL.Text := "SELECT MIN(ITEM_ID) FROM CONTENT WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
Open;
 LastItem := Fields[0].AsInteger;
SQL.Text := Format("SELECT MAX(ITEM_ID) CONTENT ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID < %d) AND (ITEM_ID >= %d)",
               [CurItemByKey, LastItem]);
   Open;


 
Palladin ©   (2008-09-19 12:25) [1]

и какая великая цель сего действия будет?


 
Alex86   (2008-09-19 12:27) [2]

Next по определенным записям в таблице


 
Palladin ©   (2008-09-19 12:29) [3]

у тебя агрегирующая функция в запросе и нет группировки
возвращатся будет всегда одна запись

ты словами опиши что ты на выходе получить хочешь, с примером


 
Alex86   (2008-09-19 12:39) [4]

Необходимо организовать перемещение по определленным записям в таблице (например записям с полем flags = 1 и полем group_id = 0). Метод должен возвращаться id записи на которую переместились. Если запись была последняя и мы вызвали методо должен возвратиться 0.

Вообщемто вот весь код метода:

function Next: Integer;
var
 LastItem: Integer;
begin
 Result := -1;
     with cmp_Query_ do
       try
         cmp_DataBase.StartTransaction;
         try
           SQL.Text := "SELECT MAX(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
           Open;
           LastItem := Fields[0].AsInteger;
           SQL.Text := Format("SELECT MIN(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID > %d) AND (ITEM_ID <= %d)",
             [CurItemByKey, LastItem]);
           Open;
           if Fields[0].AsInteger > CurItemByKey then
             Result := Fields[0].AsInteger
           else
             Result := 0;
           if Result > 0 then
             CurItemByKey := Result;
           except
             cmp_DataBase.Rollback;
           end;
           cmp_DataBase.Commit;
       except
         on E: Exception do
           raise;
       end
end;


 
Sergey13 ©   (2008-09-19 13:01) [5]

> [4] Alex86   (19.09.08 12:39)
> Необходимо организовать перемещение по определленным записям
> в таблице

Перемещаться можно по набору данных (он же датасет). По таблице перемещаться невозможно в принципе. У датасета есть свои методы для перемещения - Next, Prior, First, Last. По достижении конца датасета истинными становятся свойства датасета EOF и BOF.

Велосипед изобретаем что ли?


 
Johnmen ©   (2008-09-19 13:01) [6]

Перемещаться можно только по определленным записям в наборе данных. Который получен запросом недавно. А на текущий момент значения min/max в таблице уже м.б. другими.
А во-вторых, кури Eof и Bof.


 
ЮЮ ©   (2008-09-19 13:05) [7]

> Вообщемто вот весь код метода:


а код метода CurItemByKey?

И вообще зачем это?


> Необходимо организовать перемещение по определленным записям
> в таблице (например записям с полем flags = 1 и полем group_id
> = 0).


Выбрать нужные записи, а у любого DataSet-a есть свой Nехт.


 
Alex86   (2008-09-19 13:25) [8]

А если записей в таблице 500 000 и каждые 10 секунд могут изменяться другими пользователями, не делать же каждый раз выборку нужных записей (так как под условие выборки может подпадать и 200 000 и 300 000 тыс записей таблице).


 
Johnmen ©   (2008-09-19 13:28) [9]


> не делать же каждый раз выборку нужных записей (так как
> под условие выборки может подпадать и 200 000 и 300 000
> тыс записей таблице).

И зачем вдруг может понадабиться 200 000 записей сразу?


 
Sergey13 ©   (2008-09-19 13:34) [10]

> [9] Johnmen ©   (19.09.08 13:28)
> И зачем вдруг может понадабиться 200 000 записей сразу?

Проверить, а вдруг там уже 200 001. Вот и надо свом методом до нее досчитать.


 
Alex86   (2008-09-19 13:35) [11]

Вообщем есть таблица бд в которой содержаться товары у которых group_id = 1, и разделы у которых group_id = 0 (бд делал не я так что приходится работать с такой какая есть). Всего записей порядка 500 000. Так вот нужно сделать функцию которая позволила бы перемещаться только по товарам и в качестве результата возвращала id текущего товара.


 
Johnmen ©   (2008-09-19 13:38) [12]


> функцию которая позволила бы перемещаться только по товарам

Какова конечная цель "перемещения"?


 
Alex86   (2008-09-19 13:43) [13]

перемещение будет определять товар с которым впоследствии будем работать (+ для работы с товарами реализован ряд методов).


 
Johnmen ©   (2008-09-19 13:53) [14]

Как это перемещение может что-то определять???


 
Sergey13 ©   (2008-09-19 14:09) [15]

> [11] Alex86   (19.09.08 13:35)

Т.е. полмиллиона записей классифицирутся только флагом группа/раздел?
Разделов, я полагаю, немного, штук 100-200. и 499800 товаров. И по ним по всем перемещаться?
Шикарно! 8-)


 
Johnmen ©   (2008-09-19 14:23) [16]


> Sergey13 ©   (19.09.08 14:09) [15]
> Шикарно! 8-)

Щикарно (с) ЮП


 
ANB   (2008-09-19 15:24) [17]

Извращение, конечно, так работать со справочником. Нормально - отобрать по условию нужный, ограниченный набор данных, и работать с набором данных на локале.

Хотя иногда вылезает необходимость ходить туда - сюда по большой таблице.

Но это надо писать свой навигатор.

В таблице обязательно должно быть поле ID. Сортировка при навигации будет тогда только по нему. Или надо будет изобретать хитрый ключ для сортировки.
А дальше все просто - храним на локале ID начала и конца окна и вовремя выполняем запросы для его перемещения.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
2-1221815015
cruiser
2008-09-19 13:03
2008.10.26
Отлов нажатия определенной комбинации клавиш


15-1220005532
ekto
2008-08-29 14:25
2008.10.26
Asus-Lamborgini ноутбук


2-1221563831
sD
2008-09-16 15:17
2008.10.26
Как произвести логическое уножение чисел


15-1220412091
Slider007
2008-09-03 07:21
2008.10.26
С днем рождения ! 3 сентября 2008 среда


15-1220130234
xayam
2008-08-31 01:03
2008.10.26
Где достать словарь компьютерных сокращений/терминов?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский