Вопрос по SQL
23 сообщения
#16 лет назад
Всем привет , столкнулся с проблемкой маленькой.Как в mysql сделать запрос чтоб он выбрал все поля которые не присутствуют в другой таблице,
при этом поле по которому делается условие в таблице 2 а выбрать надо из таблицы 1
нашёл такое решение
'SELECT * FROM '. таблица1 .' WHERE id not in ( select id from '. таблица2 .' WHERE cfg_id='.$cfg_id.') ORDER BY RAND() LIMIT 1'
но такое решение ест очень много ресурсов - во второй таблице в среднем 50000 строк , в первой около 20000 => при 500 одновременных запросах сервер дохнет
пробовал LEFT JOIN делать - но результат нулевой походу из-за того что условие в другой таблице
10 сообщений
#16 лет назад
Можно и так попробывать в одном запросе:таблица1.id<>таблица2.id
and таблица2.cfg_id='.$cfg_id.'
23 сообщения
#16 лет назад
Цитата ("vovan_f"):http://www.codinghorror.com/blog/archives/000976.htmlспасибо помогло
Ищи тут.
1 сообщение
#16 лет назад
Я не так делаю. Тут надо по explainу глянуть что более напряжно для сервера. Но если есть четко LIMIT 1 и ORDER BY RAND() то тогда примерно так:
mt_srand();
$randid = mt_rand(0, тут максимальное количество строк таблицы 1);
$sql = 'SELECT * FROM '. таблица1 .' WHERE id not in ( select id from '. таблица2 .' WHERE cfg_id='.$cfg_id.') and id >= '.$randid. ' LIMIT 1';
в большинстве случаев такого хватает. Когда нет - тут уже надо на код скрипта смотреть.
35 сообщений
#16 лет назад
Если ещё актуально:
SELECT * FROM '. таблица1 .'
LEFT JOIN '. таблица2 .'
on '. таблица1 .'.id = '. таблица2 .'.id
WHERE '. таблица2 .'.id is NULL and
23 сообщения
#16 лет назад
Цитата ("vovan_f"):http://www.codinghorror.com/blog/archives/000976.html
Ищи тут.
Правильно оказалось так - меньше всего памяти жрет
SELECT p.* FROM '.proxy.' p LEFT OUTER JOIN '.proxy_status.' ps ON p.proxy=ps.proxy2 WHERE (p.proxy<>"") and ((cfg_id<>'.$cfg_id.' and ps.status<>3) or (cfg_id IS null and ps.status IS null)) ORDER BY RAND() LIMIT 1';
( (p.proxy<>"") and ((cfg_id<>'.$cfg_id.' and ps.status<>3) - конкретно к моему случаю было)