|
|
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
есть 2 таблицы: bill -> id,name score ->id,bill_id,service bill может иметь несколько score c разными service. Если нам надо выбрать список bill у которых есть score с service='delivery','collection' и 'carriage' мы это легко делаем так: Код: sql 1. Однако если нам надо выбрать bill у которых наоборот нет score с указанными service, то если сделать такой запрос наоборот: Код: sql 1. то в него тоже могут попасть эти же bill так как помимо указанных service они действительно могут иметь и другие, и соответственно not in их выберет. Можно в not in засунуть первую выборку: Код: sql 1. однако такой запрос работает крайне медленно. Можно ли реализовать его за один запрос чтобы было быстрее. Прбовал такое решение: http://stackoverflow.com/questions/12630487/mysql-select-join-many-to-many-tables-plus-in-and-not-in однако проблема в том что есть например такие service: 'delivery' и 'agent_delivery' и regexp их не различает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 20:44:47 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
например такая таблица: bill score 1 bill1 1 1 delivery 2 bill2 2 1 carriage 3 bill3 3 2 delivery 4 2 delivery 5 3 collection мне надо выбрать bill у которых нет score с service='delivery'. должно найти bill3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 20:53:05 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
извиняюсь, вот так лучше: bill 1bill12bill23bill3 score 11delivery21carriage32delivery42delivery53collection ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 20:58:42 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
так? Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 21:04:48 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
да, спасибо, так работает но проблему скорости не решает, в реальной ситуации у меня мой запрос с вложенным селектом работает 19 секунд, а этот 17, что не сильно меня спасает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 21:24:58 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
индекс (bill_id,service) присутствует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 23:51:11 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
maxtorchelда, спасибо, так работает но проблему скорости не решает, в реальной ситуации у меня мой запрос с вложенным селектом работает 19 секунд, а этот 17, что не сильно меня спасает.попробуй подзапросы (not in | not exists) переписать через left semi join anti. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 05:25:21 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
Cygapb-007индекс (bill_id,service) присутствует? блин, я реально затупил и забыл добавить индекс к bill_id, спасибо, надо быть внимательнее. Добрый Э - Эхпопробуй подзапросы (not in | not exists) переписать через left semi join anti. Первый раз про такое слышу, в мануале и гугле по поводу таких запросов в мускуле ничего не написано. Где про это можно почитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 07:53:00 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
maxtorchel, попробуйте поискать по "left join + is null" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 07:54:00 |
|
||
|
Выбрать через join one to many where not in
|
|||
|---|---|---|---|
|
#18+
Кстати, заметил что есть скрипты, которые делают выборку из бд (там может быть несколько запросов) медленно только первый раз, как и здесь было. Суть в кэше - это понятно. Правильно ли я понимаю что если есть такое что разница слишком большая, то значит надо искать чтолбец к которому нужно добавить индекс. Тоесть при правильно расставленных индексах разница не должна быть слишком большой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2014, 07:59:27 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38572398&tid=1835174]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 348ms |

| 0 / 0 |
