2013-03-12 2 views
0

Я пытаюсь получить следующую или предыдущую запись из sqlite на основе поля последнего имени в алфавитном порядке (asc или desc) из моей базы данных. Однако последнее имя не является уникальным полем, а также я могу получить только одну запись (LIMIT 1) для каждого запроса, поскольку я использую механизм обратного вызова sqlite, и я не хочу буферировать результаты для каждого возвращаемого результата из запроса (если нет другого варианта). У меня также есть уникальное поле, называемое customerId (например, id строки).Как получить следующую запись с таким же именем

Это заявление, что я в настоящее время используют:

stream << "select * from customerTable where LastName >= '" << customerLastName << "' order by LastName asc limit 1"; 

я попробовал некоторые другие заявления, такие как:

stream << "select * from customerTable where LastName >= '" << customerLastName << "' and CustomerId != " << customerId << " order by LastName asc limit 1"; 

Но это один держит листать между 2 записей с одинаковыми фамилиями.

Поэтому мне нужно найти трюк, который дал бы мне следующую (или предыдущую запись), независимо от того, когда фамилия такая же или нет.

+0

Возможно, мне здесь не хватает смысла, но почему бы не использовать 'SELECT DISTINCT'? – NPE

+0

Я не знаком с отдельными, мне нужно проверить, что один из –

+0

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

ответ

2

Гораздо более простой способ, чтобы получить все уникальные имена является использование SELECT DISTINCT:

select distinct LastName from customerTable order by LastName asc 

Это даст вам все уникальные имена в алфавитном порядке.

+0

Извините NPE, я хочу просмотреть всех клиентов в алфавитном порядке на основе их фамилии и показать их детали (нажав клавишу со стрелкой вверх или вниз). Я не хочу отфильтровывать клиентов с повторяющимися именами, но проблема заключается в использовании LIMIT 1 в инструкции sql, поскольку я использую функцию обратного вызова sqlite для обработки результатов запроса. –

0

Если вы настаиваете на использовании запросов с ограничением 1, и вы все равно хотите запросить все записи с одним и тем же именем один за другим, то вы можете продолжить свой второй подход, хотя это странно. После того, как вы запросили вторую запись с and CustomerId !=, вам нужно будет запросить следующий номер с and CustomerId not in (firstId, secondId) и так далее.

Однако вы действительно не должны идти этим путем. Чистым способом является подготовка инструкции сначала (также используйте переменные хоста вместо конкатенации строк!), А затем вызовите sqlite_step(), пока не получите все свои записи.

+0

У вас есть точка Майк. Моя проблема возникла из попытки просмотреть записи, одновременно ограничивая результаты одной записью в то время. Тогда мне не нужно буферировать результаты и анализировать их позже. Но это ограничивает меня сейчас, если имена совпадают. Я постараюсь найти работу вокруг. –

+0

Вы действительно должны изменить свой подход, отказаться от 'limit' и держать курсор открытым ... – firefrorefiddle

+0

Проблема решена. Сначала я использую следующий запрос, чтобы узнать, есть ли другой клиент с тем же именем: stream << "select * from customerTable где LastName == '" << customerLastName << "и CustomerId>" << customerId << "заказ CustomerId asc limit 1"; Если это не дает мне новый customerId, я использую следующий запрос: stream << "select * from customerTable, где LastName> '" << customerLastName << "' order by LastName asc limit 1"; –

Смежные вопросы