За последние 24 часа нас посетили 17972 программиста и 1605 роботов. Сейчас ищут 1606 программистов ...

Объеденить два запроса в один

Тема в разделе "MySQL", создана пользователем AviOn, 16 фев 2009.

  1. AviOn

    AviOn Активный пользователь

    С нами с:
    16 июл 2007
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    Кировоград, Украина
    Есть таблица каталогов.
    Надо сдедать вывод каталогов что находятся в этом.
    Параметр передается именем каталога - связи через catalogid.
    Надо сделать типа
    Код (Text):
    1. Выбрать все каталоги где catalogid равен (Выбрать catalogid где catalogName = Полученый параметр)
    Вот только я не знаю как правильно это реализовать.
    Подскажите где посмотреть...
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    PHP:
    1. <?php
    2. $sql = 'SELECT * FROM  catalogs WHERE catalogif IN(SELECT catalogid FROM catalogNames WHERE catalogNAme = "'.mysql_real_escape_string($param).'")';
    3.  
     
  3. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Psih
    странные у тебя запросы.
    не во всех случаях вложенный запрос включиццо правильно.
    чем тебе плох
    [sql]SELECT * FROM (catalogs,catalogid) WHERE catalogif=catalogid and catalogNAme = $param;[/sql]
    ?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Слияние двух таблиц, в особенности больших (не проблема здесь, зато потом так делают на гигабайтных таблицах), может один раз довести вас до Out of memory. Reset, db corruption, пиздюли от шефа. Это раз.
    Два. IN работает быстрее, т.к. не генерирует огромную временную таблицу, созданную из двух таблиц в запросе. Экономия памяти и ресурсов. А ещё и дискового io если у вас всё не влазит в память.
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    мда. апломба море, а вот по теме....
    какая в жопу временная таблица при выборке по индексу по одному значению? если там вся таблица (одна из двух), то временная будет, но все равно никак не медленнее других вариантов.
    вложенный запрос оптимизатор все равно разворачивает в обычное пересечение. Только не всегда оптимизатор с этим справляется, если у тебя там полей и условий много. И тогда он будет гонять вложенный запрос на каждую запись внешнего и это уже точно без индексов.
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    IN реализован подругому, это весьма специфичная штука для MySQL, он работает очень быстро по сравнению с JOIN или FROM A,B - почти во всех high load системах вместо JOIN используют SELECT FROM a, собирают все ID и делают SELECT FROM b WHERE id IN({implode(',', $result_a)}) и собирают результат на PHP.

    Другое дело, что неправильное использование херит все старания по оптимизации.
    З.Ы. А поработаете с кластером, вообще забудете что такое JOIN :)
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    с кластером - понятно.
    ин я и сам разумеется использую, но соображать когда что и за чем - надо.
    странно описано. ))
    select->while($row=...->select ?
    это тоже иногда необходимо.

    IN работает быстрее, когда внешний запрос сам по себе тяжел, и не надо в него нагромождать лишние условия - хз как оптимизатор их поймет по очередности.
    правда, я как раз стараюсь использовать схему
    select ... from ('.implode(',',$tables).", (select... ) tmp)
    ".implode('left join',$ljoin)."
    where

    вместо IN(select
    Это тоже в отдельных случаях косячит - - надо проверять конкретные варианты и не более одного такого включать. если их больше - то вложенные select (t1,(select t1,select))

    говорить, что ин является "особой конструкцией", я бы не стал.
    наоборот, он непонятно как реализуется в зависимости от конкретных значений. то ли индекс, то ли диапазон и т.п.
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    AviOn не смотри сюда, мы уже о своем о женском ))