Есть таблица каталогов. Надо сдедать вывод каталогов что находятся в этом. Параметр передается именем каталога - связи через catalogid. Надо сделать типа Код (Text): Выбрать все каталоги где catalogid равен (Выбрать catalogid где catalogName = Полученый параметр) Вот только я не знаю как правильно это реализовать. Подскажите где посмотреть...
PHP: <?php $sql = 'SELECT * FROM catalogs WHERE catalogif IN(SELECT catalogid FROM catalogNames WHERE catalogNAme = "'.mysql_real_escape_string($param).'")';
Psih странные у тебя запросы. не во всех случаях вложенный запрос включиццо правильно. чем тебе плох [sql]SELECT * FROM (catalogs,catalogid) WHERE catalogif=catalogid and catalogNAme = $param;[/sql] ?
Слияние двух таблиц, в особенности больших (не проблема здесь, зато потом так делают на гигабайтных таблицах), может один раз довести вас до Out of memory. Reset, db corruption, пиздюли от шефа. Это раз. Два. IN работает быстрее, т.к. не генерирует огромную временную таблицу, созданную из двух таблиц в запросе. Экономия памяти и ресурсов. А ещё и дискового io если у вас всё не влазит в память.
мда. апломба море, а вот по теме.... какая в жопу временная таблица при выборке по индексу по одному значению? если там вся таблица (одна из двух), то временная будет, но все равно никак не медленнее других вариантов. вложенный запрос оптимизатор все равно разворачивает в обычное пересечение. Только не всегда оптимизатор с этим справляется, если у тебя там полей и условий много. И тогда он будет гонять вложенный запрос на каждую запись внешнего и это уже точно без индексов.
IN реализован подругому, это весьма специфичная штука для MySQL, он работает очень быстро по сравнению с JOIN или FROM A,B - почти во всех high load системах вместо JOIN используют SELECT FROM a, собирают все ID и делают SELECT FROM b WHERE id IN({implode(',', $result_a)}) и собирают результат на PHP. Другое дело, что неправильное использование херит все старания по оптимизации. З.Ы. А поработаете с кластером, вообще забудете что такое JOIN
с кластером - понятно. ин я и сам разумеется использую, но соображать когда что и за чем - надо. странно описано. )) select->while($row=...->select ? это тоже иногда необходимо. IN работает быстрее, когда внешний запрос сам по себе тяжел, и не надо в него нагромождать лишние условия - хз как оптимизатор их поймет по очередности. правда, я как раз стараюсь использовать схему select ... from ('.implode(',',$tables).", (select... ) tmp) ".implode('left join',$ljoin)." where вместо IN(select Это тоже в отдельных случаях косячит - - надо проверять конкретные варианты и не более одного такого включать. если их больше - то вложенные select (t1,(select t1,select)) говорить, что ин является "особой конструкцией", я бы не стал. наоборот, он непонятно как реализуется в зависимости от конкретных значений. то ли индекс, то ли диапазон и т.п.