Антонина Б.
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 делать - но результат нулевой походу из-за того что условие в другой таблице
Виталий Раевский
36 сообщений
#16 лет назад
А если через LEFT JOIN и HAVING ?
Pavel Komsomoloff
10 сообщений
#16 лет назад
Можно и так попробывать в одном запросе:

таблица1.id<>таблица2.id
and таблица2.cfg_id='.$cfg_id.'
Владимир Ф.
1322 сообщения
#16 лет назад


Ищи тут.
Антонина Б.
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) - конкретно к моему случаю было)