|
|
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Всем привет. Помогите решить задачку: В запросе products это продукты product_w связка двух таблиц один ко многим product_words перечень встречающихся слов. Те. продукт "масло сливочное" делает в этой таблице строки "масло" и "сливочное" как в запросе вида Код: sql 1. 2. 3. 4. 5. 6. при указании в условии двух слов "масло сливочное" получить только "масло сливочное", а не вариации "масло первое", "сливочное второе" и т.п. ? предвидя вопрос почему не like по products: я так понимаю из-за размера базы решили все предложения разбить на слова и засунуть их в индексируемое поле в product_words. Ищет действительно очень быстро (тестовая база 200тыс продуктов, рабочая на порядок больше), но находит не всегда то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 18:46 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Вариант с (pw.name starting with 'масло') AND (pw.name starting with 'сливочное') не проходит, вообще ничего не находит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 18:48 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
group by вместо distinct + having count(*) = 2 Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 18:53 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Не совсем понял что это даст? Можете пояснить? Попробовал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. получил кучу "сливочное" без масла например. В общем таже проблема, но порядок строк поменялся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 19:01 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2получил кучу "сливочное" без масла например. Замени starting with на точное равенство. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 19:15 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovShaman2получил кучу "сливочное" без масла например. Замени starting with на точное равенство. будут юзеры возмущатся. Так как окончание слова могут написать как угодно, часто набирают "масло сливо" и уже находят нужный результат в выдаче. Есть еще какие-то варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 19:17 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
А ты уверен, что в этой таблице слов не будет именно "масло" и "сливо"?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 19:26 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА ты уверен, что в этой таблице слов не будет именно "масло" и "сливо"?.. На данный момент нет :) Если в выдачу попадут слова "масло сливо" "масло сливочное" "сливочное масло" то логика работы такова, что уже в выдаче стрелками вверх-вниз среди искомого выберут нужное. Задача сейчас стоит набрав части слов или пару слов получить искомое, а не левое в поиске вроде "масло растительное" "масло детское", "мороженное сливочное" и т.п. И вот тут я как раз застрял и надолго, пришлось писать сюда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:24 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2На данный момент нет :) Так вот иди и пока не выяснишь как формируется таблица слов и связей и почему в выборку попадает не то что нужно - не возвращайся. Потому что мой запрос - правильный и на правильно сформированной таблице слов должен делать именно то что тебе надо. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:37 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2, вот это меня очень беспокоит Код: sql 1. 2. 3. в плане производительности. Думаю, будет весьма хреново. Как минимум, смысл right join от меня ускользает. Что, в products может не быть записей, которые справа, в этом select distinct? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:38 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
kdvвот это меня очень беспокоит в плане производительности. Сдаётся мне, что именно для производительности это сделано: чтобы зафиксировать порядок соединения и уменьшить ширину сортируемого НД. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:41 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2И вот тут я как раз застрял и надолго, пришлось писать сюда.Да. Надо вас спасать. Хорошая задачка, мозг чуток размять пришлось... :-) Пробуйте. DDL + test data: Код: 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. 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. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. Код: 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. 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. ЗЗЫ. Знаки вопроса в выводимых данных - следствие хз чего при работе с UTF8 в isql при его запуске в консоли линуха. По идее, на нормальном клиенте всё должно быть Ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:42 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Таблоид, тебе пора деньги брать за решения sql :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:43 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovkdvвот это меня очень беспокоит в плане производительности. Сдаётся мне, что именно для производительности это сделано: чтобы зафиксировать порядок соединения и уменьшить ширину сортируемого НД. Именно. Так как если я пользую right join то скорость выборки 312мс, а вот если просто join то тогда выборка идет более 3 секунд и использует почему-то план products natural ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:44 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
kdvтебе пора деньги брать за решения sql :-)да это я так просто, sql-ex.ru вспомнил... чуть не всплакнул даже... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:47 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovShaman2На данный момент нет :) Так вот иди и пока не выяснишь как формируется таблица слов и связей и почему в выборку попадает не то что нужно - не возвращайся. Потому что мой запрос - правильный и на правильно сформированной таблице слов должен делать именно то что тебе надо. Там все хитро. Процедура заполнения слов работает так: Вот есть код товара, есть наименование "масло сливочное" Убираются все знаки препинания, точнее заменяются на пробел. Потом все приводится к английским буквам (как буд-то раскладку забыли переключить) Теперь в таблицу слов вводятся полный код товара, далее вводится "масло сливочное" (приведеное к инглишу), потом вводится "масло", потом "сливочное" И так каждый товар. В итоге можно искать по коду, можно искать по первым буквам слова, при этом если не переключили раскладку и набрали английские буквы, всеравно найдет. Проблема вылезла при поиске двух или трех слов или частей слов если полностью фразу непомнят. Плюс тормоза. И вот тут уже обратились ко мне. Тормоза вылечил, а в поиске застрял, хоть и на первый взгляд задача была легкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 22:52 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Таблоид Процедурка prod_by_patterns учитывает не только "все слова из шаблона", но и количество каждого из указанных в нём слов - см примеры под спойлером "Test". ЗЗЫ. Знаки вопроса в выводимых данных - следствие хз чего при работе с UTF8 в isql при его запуске в консоли линуха. По идее, на нормальном клиенте всё должно быть Ок. Ого, если это все заработает на больших обьемах данных то Вам цены нету. Спасибо, будем пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 23:00 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2далее вводится "масло сливочное" (приведеное к инглишу), потом вводится "масло", потом "сливочное" Отсюда и проблема. "масло сливочное" в таблицу слов вводить нельзя. И нужно добавить проверку на уникальность слов. Если, конечно, не требуется и в самом деле искать тавтологии. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 23:02 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2, оставаясь в "стиле" исходного запроса то как-то вот так Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 23:43 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovShaman2далее вводится "масло сливочное" (приведеное к инглишу), потом вводится "масло", потом "сливочное" Отсюда и проблема. "масло сливочное" в таблицу слов вводить нельзя. да, тут я ошибся. Целая фраза вводится только если это коды товара, наименование раскладывается по словам. Dimitry Sibiryakov И нужно добавить проверку на уникальность слов. Если, конечно, не требуется и в самом деле искать тавтологии. так и есть, перед вставкой слов в таблицу идет проверка нет ли уже такого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 00:52 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
m7mShaman2, оставаясь в "стиле" исходного запроса то как-то вот так Код: sql 1. 2. 3. 4. 5. 6. неработает. вообще не находит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 00:57 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
ТаблоидЗЫ. Процедурка prod_by_patterns учитывает не только "все слова из шаблона", но и количество каждого из указанных в нём слов - см примеры под спойлером "Test". ЗЗЫ. Знаки вопроса в выводимых данных - следствие хз чего при работе с UTF8 в isql при его запуске в консоли линуха. По идее, на нормальном клиенте всё должно быть Ок. Две ошибки: Column does not belong to referenced table. Dynamic SQL Error. SQL error code = -206. Column unknown. E.S1. At line 36, column 31. эту я вроде подправил, но после нее лезет другая Column does not belong to referenced table. Dynamic SQL Error. SQL error code = -206. Column unknown. R.K. At line 69, column 1. тут застрял. На что оно ругается? По коду вроде все верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 01:23 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2так и есть, перед вставкой слов в таблицу идет проверка нет ли уже такого Тогда почему у тебя на одно "масло" вылезает две записи? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 02:02 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovShaman2так и есть, перед вставкой слов в таблицу идет проверка нет ли уже такого Тогда почему у тебя на одно "масло" вылезает две записи? Хм... есть такое. Слова разделяются по пробелу или по какому-то разделителю например. И оказываются в базе есть масло2648, масло1648, которые являются что-то вроде артикулов или окончание штрихкода наверное. И они же в таком виде записаны в базу слов. Вот и две-три записи. Чтобы было понятнее, возьмем например другое направление: "audi80", "audi100", "audi". У одного клиента когда-то так писали, именно слитно. Но применительно к текущей задаче это было бы три разных слова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 03:06 |
|
||
|
Выборка значений из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Shaman2оказываются в базе есть масло2648, масло1648при вставке в словарь проверять не уникальность, а факт того, что вновь вставляемое слово является началом уже имеющегося и не вставлять. промахов станет немного меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2014, 08:14 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38655168&tid=1563551]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
194ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 515ms |

| 0 / 0 |
