Michael
27.08.2009 - 15:59
Я этот запрос по быстрому написал. Лучше будет:
SQL |
SELECT* from stat st1 where CONCAT(st1.name,st1.last) not in ( select distinct CONCAT(st2.name,st2.last) from stat st2 where st2.articul=622 ) |
Цитата |
я и хотел заставить mysql выполнять вложенный запрос один раз, вместо раза для каждой записи. |
Почему? MySQL сначала построит проверочное множество, а потом раз пройдет по основной таблице. Это же не кореллированный подзапрос.
glock18 спасибо за оценку.
_____________
There never was a struggle in the soul of a good man that was not hard
glock18
27.08.2009 - 16:08
SQL |
SELECT s.* FROM (SELECT CONCAT(name,' ', last) as fullname, GROUP_CONCAT(CONCAT(articul, ' ') SEPARATOR ',') as art FROM stat s GROUP BY name) filter JOIN stat s ON CONCAT(s.name, ' ', s.last) = filter.fullname AND LOCATE('622 ', filter.art) = 0; |
Вот оно еще одно решение. С гораздо более страшным explain'ом
mysql меня огорчил и стал выполнять запрос другом порядке
Копаться с этим запросом мне уже надоело. Так что действительно, решение предложенное
Michael, пожалуй, единственное нормальное.
Это мое решение разве что за музейный экспонат пойдет
glock18
27.08.2009 - 16:14
Michael
Судя по explain, твой первый запрос был быстрее. И это логично - наличие distinct вынуждает mysql использовать временную таблицу.
Цитата |
Почему? MySQL сначала построит проверочное множество, а потом раз пройдет по основной таблице. Это же не кореллированный подзапрос. |
Увы, нет. так же как со всеми или может быть почти со всеми вложенными запросами.
Цитата |
"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra" 1,"PRIMARY","st1","ALL","","","","",6,"Using where" 2,"DEPENDENT SUBQUERY","st2","ALL","","","","",6,"Using where; Using temporary" |
тут правда сложно разобрать что-то. видно только порядок выполнения запросов и тип второго запроса. это обо всем говорит
Это explain для второго твоего. у первого, как я уже сказал, не было using temporary.
Справедливости ради скажу, что у запроса, который я "родил", explain гораздо более страшный
Michael
27.08.2009 - 16:17
Жалко нет
он бы чем-нибудь обязательно удивил в SQL.
А автор непонятно разобрался или нет...
_____________
There never was a struggle in the soul of a good man that was not hard
Цитата (Michael @ 27.08.2009 - 12:17) |
Жалко нет
он бы чем-нибудь обязательно удивил в SQL.
А автор непонятно разобрался или нет... |
спасибо большое - разобрался, проверил
тока еще есть вопрос -
SELECT* from stat st1 where CONCAT(st1.name,st1.last) not in (
select distinct CONCAT(st2.name,st2.last)
from stat st2 where st2.articul=622
)
как можно использовать данный запрос на Interbase ?
Michael
27.08.2009 - 17:56
Цитата |
как можно использовать данный запрос на Interbase ? |
То же самое - запрос типовой для SQL, только узнать какая функция соединяет строки в Interbase и заменить ей concat.
_____________
There never was a struggle in the soul of a good man that was not hard
SeryiVolk
27.08.2009 - 18:31
Цитата (Michael @ 27.08.2009 - 13:56) |
То же самое - запрос типовой для SQL, только узнать какая функция соединяет строки в Interbase и заменить ей concat. |
Спасибо всем за ответы!
думаю разберусь
SeryiVolk
28.08.2009 - 06:44
вобщем у меня появился вариант добавить каждому человек уникальный ID, вот:
Цитата |
idnumber Name last articul
A00012 ivan petrov 622
A00012 ivan petrov 623 A00011 petya ivanoff 2000
A00025 kolya pupkin 621
A00016 kostya popov 621 |
и тогда сделать такой запрос:
SQL |
SELECT IDNUMBER, NAME, LAST, ARTICUL FROM STAT WHERE IDNUMBER NOT IN ( SELECT IDNUMBER FROM STAT WHERE ARTICUL = 622 ) |
правильно?
! |
|
М |
| Пользуйся тегами форматирования - не первый пост уже, а форматирования так и нет. Кнопки находятся над формой написания поста. |
glock18 |
glock18
28.08.2009 - 08:30
да, так тоже можно
DenPHP
28.08.2009 - 10:26
оо гуд это можно строить такие конструкции
SQL |
SELECT * FROM STAT WHERE * NOT IN ( SELECT IDNUMBER FROM STAT WHERE * NOT IN (SELECT IDNUMBER FROM STAT WHERE * NOT IN *) ) |
такого вида? вложеные?
Michael
28.08.2009 - 10:34
DenPHP все можно только очень осторожно.
А твой запрос не гуд.
_____________
There never was a struggle in the soul of a good man that was not hard
SeryiVolk
28.08.2009 - 10:52
сори, не знал про теги...
все получилось
glock18
28.08.2009 - 11:02
Цитата |
оо гуд это можно строить такие конструкции |
интересно, зачем?
SeryiVolk
28.08.2009 - 12:13
на деле оказалось этот запрос в реальной базе капппец просто как долго выполняется
может как то оптимизировать ?
Michael
28.08.2009 - 12:20
А что ты последнее вводишь?
Было ж две версии. (с distinct и без)
_____________
There never was a struggle in the soul of a good man that was not hard
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.