Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > [MySQL]mysql что лучше JOIN или одиночная выборка


Автор: neoks 11.1.2013, 16:13
Всегда интересовал такой вопрос, как улучшить выборку, использую стандартный метод

Код

$select = $sl->db->query('SELECT * FROM `images`LIMIT 5');

while($row = $sl->db->get_row($select)){
    $user = $sl->db->query('SELECT * FROM `users` WHERE id='.$row['cid']);
}


Но наткнулся на JOIN и можно сделать все это одним запросом

Код

$select = $sl->db->query('SELECT * FROM `images`,`users` WHERE images.cid=users.id LIMIT 5');

while($row = $sl->db->get_row($select)){
    print_r($row);
}


Скажите какой из этих вариантов лучше и не будет тормозить бд, склоняюсь к JOIN так как мне кажется чем меньше запросов тем лучше ))

Автор: Arantir 11.1.2013, 16:22
Чем меньше запросов, тем лучше. Но без фанатизма =)

В первом случае для каждого SELECT будет проводится новый поиск по таблице. В то же время во втором случае, что не сложно заметить, все может быть осуществлено всего лишь за один проход. Итого разница примерно в N раз, где N - количество выбираемых записей.

Автор: neoks 11.1.2013, 16:42
То есть JOIN тут в самый раз )) еше вопрос такой, скажем мне нужно подсчитать количество записей в разных таблицах, сейчас я юзаю очень просто

Код

SELECT COUNT(id) as count FROM `images` WHERE cid=1


И так для 11 таблиц и того 11 запросов, как тут лучше, будет ли лучше использовать JOIN и вопрос как правильно написать ? )

Автор: Aliance 11.1.2013, 17:07
Одним запросом
Код

SELECT COUNT(id) as count, cid FROM `images` GROUP BY cid

получаешь массив count`ов, дальше в цикле выбираешь по нужному cid.

По-моему тема никак не относится к php, вопрос чисто по sql

Автор: neoks 11.1.2013, 17:12
А вот теперь я попал в тупик, скажем нужно объединить 3 таблицы и вытащить только те записи которые мне нужны )

Код

SELECT * FROM `images`,`users` WHERE images.cid=users.id AND images.id = 5 LIMIT 5


Вытаскивает все записи где есть совпадениея images.cid=users.id и добовляет еше записи где images.id

Как ему сказать что нужно вытаскивать только эти images.id и их ID юсеров ? )

Добавлено через 2 минуты и 33 секунды
Цитата(Aliance @  11.1.2013,  17:07 Найти цитируемый пост)
По-моему тема никак не относится к php, вопрос чисто по sql 

Да сори, чет ступил )) не поглядел куда пишу )

Цитата(Aliance @  11.1.2013,  17:07 Найти цитируемый пост)
SELECT COUNT(id) as count, cid FROM `images` GROUP BY cid


Но мне нужно подсчитать из таблицы images,users,pages, и дт все 11 или оставить как есть одни запрос на каждую таблицу ? )

Автор: Arantir 11.1.2013, 17:25
Цитата(neoks @  11.1.2013,  16:12 Найти цитируемый пост)
Как ему сказать что нужно вытаскивать только эти images.id и их ID юсеров ? )

Не очень понял, но вы что, об этом говорите?
Цитата

SELECT images.id, images.cid, users.id  FROM `images`,`users` WHERE images.cid=users.id AND images.id = 5 LIMIT 5


Цитата(neoks @  11.1.2013,  16:12 Найти цитируемый пост)
Но мне нужно подсчитать из таблицы images,users,pages, и дт все 11 или оставить как есть одни запрос на каждую таблицу ? )
Попробуйте 
Код

SELECT images.id, users.id, pages.id  FROM `images`,`users`, `pages`
ну только для всех 11 таблиц сразу

Автор: neoks 11.1.2013, 18:36
Ага все разобрался, это я просто не то чет написал и чет коряво отображало, Спасибо за ответы буду дальше оптимизировать запросы ))

Автор: Zloxa 11.1.2013, 20:19
Какой милый топик.
Давно с такими не встречался.
Zloxa стирает скупую мужскую слезу умиления.
Спасибо за добрые эмоции.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)