|
|
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Есть БД с номером поля и 5 числами. 50000 записей. Выбираю одну запись случайным образом и ищу по базе похожие, т.е. записи, содержащие 4,3,2 из 5 чисел этой записи. Здесь я что-то не допонимаю, как работает SEEK. Она не обрабатывает все записи, находит одну и успокаивается. А мне надо дальше искать :-) Циклы пробовал, тоже не получается. Что я делаю неправильно? Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2006, 00:48 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Если так уж сильно в лом почитать HELP, то хоть сам поэкспериментировать мог бы как работает SEEK. Всего-то надо открыть BROWSE-окно, последовательно давать команды в командном окне и смотреть куда встанет указатель записи. Выражение типа SEEK(1) AND SEEK(2) означает, что в таблице есть запись со значением индексного ключа 1 и со значением индексного ключа 2. Причем, вовсе не обязательно, что это одна запись. Ты сначала делаешь поиск по ключу 1, а потом НОВЫЙ поиск по ключу 2. Опиши задачу более подробно. Хотя бы приведи структуру твоей таблицы. Что ищешь и что должно получиться в результате. Только не словами, а таблицами. Вот есть такие данные, надо найти вот эти данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2006, 11:56 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
понятно, так я и думал. Хелп я читал, но не понял. Спасибо за объяснение. Задача более подробно: есть таблица (50000 записей). Идентификатор поля (I AutoInc) и 5 полей со случайными числами от 1 до 25 (c). я посчитал, что character будет более удобным. Каждая запись уникальна и отсортирована по возрастанию. Я выбираю случайно одну запись. Затем ищу все записи, которые имеют любые 4 из 5 чисел той выбранной записи. Затем ищу 3 из 5, 2 из 5. Это лотерея (имитация розыгрыша). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2006, 17:36 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
При такой структуре данных простого решения не получишь. Проблема в том, что непонятно что именно надо искать. Не в смысле постановки задачи (это-то ясно), а в смысле структуры данных. Предположим, у тебя в одной записи есть 5 чисел, выстроенных в порядке возрастания: 2, 5, 7, 10, 20 Надо найти записи, у которых совпадают 4 из этих 5 чисел. Ты представляешь общее количество вариантов таких совпадений? ЧТО искать будем? Надо найти именно запись, а не числа. Причем заранее неизвестно в какой именно позиции искомые числа находятся. Ну, предположим, ищем первые 4 числа. Это значит возможны такие варианты X, 2, 5, 7, 10 2, X, 5, 7, 10 2, 5, X, 7, 10 2, 5, 7, X, 10 2, 5, 7, 10, X Здесь вместо X - любое число. А теперь, по очереди выбрасывай числа из оригинальной последовательности. Т.е. всего имеем 25 вариантов того, чего надо искать. И это только на ОДНУ запись. А у тебя их 50000. Тут надо действовать по другому. Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Могу сразу сказать, что этот код будет работать ОЧЕНЬ медленно. Идея проверки основана на работе функции ChrTran() ?ChrTran("ABCDE","ABCFG","") В таком синтаксисе из первого выражения будут исключены все символы встречающиеся во втором. При этом, не важно где именно в выражении эти символы находились. Далее остается проверить длину полученного выражения. Если были исключены 4 символа, длина будет 1. Чтобы представить число 25 как один символ я предполагаю, что 25 это ASCII-код символа и перевожу его в символ при помощи функции CHR(). Поскольку у тебя все данные записаны в символьном виде, то перевожу их в числа при помощи функции VAL(). То же самое в виде запроса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Здесь вместо многоточий во всех 3 выражениях надо писать одно и то же Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Т.е. все тот же CharTran, где первое выражение составлено из полей первой копии таблицы, а второе - из полей второй копии таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2006, 20:17 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Hi Владимир! Практически идентичное обсуждение (касающееся лотерейной игры) было некоторое время назад на этом форуме - никакого приемлемого (по времени работы) способа сделать это на фоксе найдено не было - я специально посылал код на C# реализующий определённый вид поиска решения (не такой как требуется сейчас :) но это не существенно). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2006, 18:10 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Мда, нетривиально. Спасибо большое, разбираюсь. Почему-то Фокс выдает ошибку The LOCATE command must be issued before the CONTINUE command в Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2006, 20:26 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Практически идентичное обсуждение (касающееся лотерейной игры) было некоторое время назад на этом форуме - никакого приемлемого (по времени работы) способа сделать это на фоксе найдено не было Да, я читал это обсуждение :-) Интересно, хотя там были другие условия самой игры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2006, 20:30 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
100gramМда, нетривиально. Спасибо большое, разбираюсь. Так ведь и задачка... Не то, чтобы тривиальная ;) 100gramПочему-то Фокс выдает ошибку The LOCATE command must be issued before the CONTINUE command в Код: plaintext 1. 2. 3. 4. 5. Скорее всего, забыл перед командой LOCATE перейти в нужную рабочую область. В данном случае в рабочую область TabDoubl. Т.е. нужно было Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 02:07 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Еще раз :-) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. После перебора выдает, что в тысяче записей обнаружна тысяча выпадений 4 из 5, 3 из 5, 2 из 5... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 14:24 |
|
||
|
проблема с SEEK
|
|||
|---|---|---|---|
|
#18+
Ну, ты даешь. Надо же самому думать! Расти над собой! Откуда я знаю, что у тебя за функция game2(1)? Что именно она возвращает? Зачем тебе вообще SCAN по BigTable если ты берешь значения из непонятной функции game2(1)? Кроме того, данный код имеет смысл, если в одной записи не может быть одинаковых значений. Т.е. строка со значниями 1,1,2,2,3 - не допустима. Поэкспериментируй с функцией ChrTran(). Посмотри что при этом получится. В крайнем случае сделай проверку для одной записи и главной таблицы. Просто посмотри какие именно записи будут найдены как имеющие повторения и сопоставленные с этой записью основной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 21:33 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33654765&tid=1591934]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
207ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 270ms |
| total: | 594ms |

| 0 / 0 |
