|
|
|
Условие для LIMIT
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть таблица, с двумя основными полями - uid и status +------+--------+---------+ | id | uid | status | +------+--------+---------+ | 1 | 1 | 1 | | 2 | 1 | 1 | | 3 | 1 | 0 | | 4 | 3 | 0 | | 5 | 3 | 0 | | 6 | 4 | 0 | | 7 | 4 | 1 | | 8 | 4 | 0 | | 9 | 4 | 1 | | 10 | 4 | 0 | | 11 | 5 | 0 | | 12 | 5 | 1 | +------+---------+---------+ Нужно сделать выборку id по определенным условиям (uid > n и status = 1) НО нужно, чтобы возвращались все подходящие строки только для одного uid, который я заранее не знаю. Пример: Код: plsql 1. Мне нужны строки 1 и 2 только для uid 1, т.к. на него пришлось первое вхождение Другой пример: Код: plsql 1. В данном случае нужны строки 7 и 9, т.к. первое вхождение по условию пришлось на uid 4 и у него 2 совпавших поля. Пробую сделать при помощи переменной: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Возвращает то что нужно - 1 и 2 Все замечательно получилось, но когда применил данный способ в проекте, вылезла неприятная вещь - запрос возвращает чушь после применения сортировки ORDER BY t.uid ASC; Без сортировки не обойтись никак. Если в таблице значения uid идут не по порядку (что в проекте - обычное дело): +------+--------+---------+ | id | uid | status | +------+--------+---------+ | 5 | 3 | 0 | <сначала 3 | 6 | 4 | 0 | | 7 | 4 | 1 | | 8 | 4 | 0 | | 9 | 4 | 1 | | 10 | 4 | 0 | | 11 | 5 | 1 | | 12 | 5 | 1 | | 13 | 6 | 0 | | 14 | 1 | 1 | <затем 1 | 15 | 1 | 1 | | 16 | 4 | 1 | +------+---------+---------+ То при том же запросе с t.uid > 0 вернет строки для uid = 4, т.к. она стоит раньше, а записи для uid = 1 не вернет НИКОГДА. После модификации запроса и добавления к нему ORDER BY t.uid ASC по логике должно вернуть 14 и 15 строки, но результат оказывается непредсказуем: Возвращает по порядку 14, 15, 7, 9, 16, 11, 12 - хотя на первых двух результатах ему следовало остановиться. Самый очевидный вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. не подходит, нужно избавиться от необходимости делать двойную выборку и избавиться от подзапроса и дупликации условий. В проекте очень большой список WHERE и огромный объем данных в таблице. Данный способ замедляет запрос в 200 раз. В чем может быть проблема моего варианта? Или может я некорректный способ выбрал для реализации данной задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 08:24:06 |
|
||
|
Условие для LIMIT
|
|||
|---|---|---|---|
|
#18+
VladimirMerk Код: sql 1. 2. 3. 4. 5. 6. 7. 8. explain посмотрите есть там строчка с dependent subquery ? или тут покажите сдаётся мне, что вам поможет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. P.S. Надеюсь, индекс по uid имеется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 08:31:04 |
|
||
|
Условие для LIMIT
|
|||
|---|---|---|---|
|
#18+
tanglir, да, такой индекс есть. Dependent subquery была в эксплейне. Попробовал Ваш способ. Стало быстрее, но все равно - с этим джойном медленне в 32 раза. В проекте запрос выглядит так: Код: plsql 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. Как видите, в запросе 4 лефт джойна, получается что при подзапросе, или джойне в вашем случае - количество лефт-джойнов повышается в 2 раза. Запрос сам по себе не быстрый. Может есть еще какие-то варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 10:22:46 |
|
||
|
Условие для LIMIT
|
|||
|---|---|---|---|
|
#18+
VladimirMerkСамый очевидный вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Не, самый очевидный - это Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 11:10:06 |
|
||
|
Условие для LIMIT
|
|||
|---|---|---|---|
|
#18+
VladimirMerkВсе замечательно получилось, но когда применил данный способ в проекте, вылезла неприятная вещь - запрос возвращает чушь после применения сортировки ORDER BY t.uid ASC; Без сортировки не обойтись никак. SELECT из вложенного запроса с внешней сортировкой не пробовали? Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 11:16:00 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38552770&tid=1835259]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 286ms |

| 0 / 0 |
